From 462238eb8a34fd902962f9e98f6e595ebdce0eee Mon Sep 17 00:00:00 2001 From: Nischal Sharma Date: Wed, 14 Aug 2024 01:35:38 +0530 Subject: [PATCH 1/4] Constantine bindings for EIP196 (#184) * constantine bindings for EIP-196, EIP-197 Signed-off-by: Nischal Sharma Co-authored-by: garyschulte --- .github/workflows/build.yml | 35 ++++- .gitignore | 8 +- .gitmodules | 3 + build.sh | 40 +++++ constantine/build.gradle | 145 ++++++++++++++++++ constantine/constantine | 1 + constantine/ethereum_evm_precompiles.c | 51 ++++++ constantine/ethereum_evm_precompiles.h | 37 +++++ .../constantine/LibConstantineEIP196.java | 42 +++++ .../ConstantineEIP196G1AddTest.java | 66 ++++++++ .../ConstantineEIP196G1MulTest.java | 68 ++++++++ .../ConstantineEIP196PairingCheckTest.java | 65 ++++++++ .../constantine/LibConstantineEIP196Test.java | 45 ++++++ .../src/test/resources/eip196_g1_add.csv | 109 +++++++++++++ .../src/test/resources/eip196_g1_mul.csv | 107 +++++++++++++ .../src/test/resources/eip196_pairing.csv | 15 ++ settings.gradle | 1 + 17 files changed, 836 insertions(+), 2 deletions(-) create mode 100644 constantine/build.gradle create mode 160000 constantine/constantine create mode 100644 constantine/ethereum_evm_precompiles.c create mode 100644 constantine/ethereum_evm_precompiles.h create mode 100644 constantine/src/main/java/org/hyperledger/besu/nativelib/constantine/LibConstantineEIP196.java create mode 100644 constantine/src/test/java/org/hyperledger/besu/nativelib/constantine/ConstantineEIP196G1AddTest.java create mode 100644 constantine/src/test/java/org/hyperledger/besu/nativelib/constantine/ConstantineEIP196G1MulTest.java create mode 100644 constantine/src/test/java/org/hyperledger/besu/nativelib/constantine/ConstantineEIP196PairingCheckTest.java create mode 100644 constantine/src/test/java/org/hyperledger/besu/nativelib/constantine/LibConstantineEIP196Test.java create mode 100644 constantine/src/test/resources/eip196_g1_add.csv create mode 100644 constantine/src/test/resources/eip196_g1_mul.csv create mode 100644 constantine/src/test/resources/eip196_pairing.csv diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ebc5ca3e..3f899c5f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -28,6 +28,10 @@ jobs: # rust dependencies export CARGO_HOME="$HOME/.cargo" curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain 1.75.0 + # nim dependencies + export CHOOSENIM_CHOOSE_VERSION=2.0.4 + curl https://nim-lang.org/choosenim/init.sh -sSf | sh -s -- -y + export PATH=$HOME/.nimble/bin:$PATH - name: Checkout Repo uses: actions/checkout@v4 with: @@ -81,6 +85,11 @@ jobs: with: name: gnark native build artifacts path: gnark/build/ + - uses: actions/upload-artifact@v3.1.0 + with: + name: constantine native build artifacts + path: constantine/build/ + native-build-linux-arm64: runs-on: besu-arm64 env: @@ -91,7 +100,7 @@ jobs: with: submodules: recursive - name: Build - run: + run: | docker run -e SKIP_GRADLE=$SKIP_GRADLE -v $(pwd):/home/ubuntu ubuntu:20.04 /home/ubuntu/native-build.sh - uses: actions/upload-artifact@v3.1.0 with: @@ -121,6 +130,7 @@ jobs: with: name: gnark native build artifacts path: gnark/build/ + native-build-macos: runs-on: macos-13 env: @@ -139,6 +149,10 @@ jobs: export PATH="$HOME/.cargo/bin:$PATH" rustup target add x86_64-apple-darwin rustup target add aarch64-apple-darwin + # nim dependencies + export CHOOSENIM_CHOOSE_VERSION=2.0.4 + curl https://nim-lang.org/choosenim/init.sh -sSf | sh -s -- -y + export PATH=$HOME/.nimble/bin:$PATH - name: Checkout Repo uses: actions/checkout@v4 with: @@ -173,6 +187,11 @@ jobs: with: name: gnark native build artifacts path: gnark/build/ + - uses: actions/upload-artifact@v3.1.0 + with: + name: constantine native build artifacts + path: constantine/build/ + native-build-m1: runs-on: macos-13-xlarge env: @@ -201,6 +220,10 @@ jobs: export PATH="$HOME/.cargo/bin:$PATH" rustup target add x86_64-apple-darwin rustup target add aarch64-apple-darwin + # nim dependencies + export CHOOSENIM_CHOOSE_VERSION=2.0.4 + curl https://nim-lang.org/choosenim/init.sh -sSf | sh -s -- -y + export PATH=$HOME/.nimble/bin:$PATH - name: Checkout Repo uses: actions/checkout@v4 with: @@ -248,6 +271,11 @@ jobs: with: name: gnark native build artifacts path: gnark/build/ + - uses: actions/upload-artifact@v3.1.0 + with: + name: constantine native build artifacts + path: constantine/build/ + final-assembly: runs-on: ubuntu-20.04 needs: @@ -293,6 +321,11 @@ jobs: with: name: gnark native build artifacts path: gnark/build/ + - name: Download constantine + uses: actions/download-artifact@v3 + with: + name: constantine native build artifacts + path: constantine/build/ - name: Set up Java uses: actions/setup-java@v4 with: diff --git a/.gitignore b/.gitignore index c4a3c6b8..80ef81a1 100644 --- a/.gitignore +++ b/.gitignore @@ -10,10 +10,16 @@ Cargo.lock .gradle +*.DS_Store + ## build files *.com *.class *.dll *.exe *.o -*.so \ No newline at end of file +*.so + +*.a +*.dylib +constantine/out \ No newline at end of file diff --git a/.gitmodules b/.gitmodules index ebff35b6..d798b8b9 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,3 +7,6 @@ [submodule "secp256r1/besu-native-ec"] path = secp256r1/besu-native-ec url = git@github.com:ConsenSys/besu-native-ec.git +[submodule "constantine/constantine"] + path = constantine/constantine + url = https://github.com/mratsim/constantine.git diff --git a/build.sh b/build.sh index 520c025b..4e5620ff 100755 --- a/build.sh +++ b/build.sh @@ -319,6 +319,45 @@ EOF cp libgnark_eip_196.* "$SCRIPTDIR/gnark/build/${OSARCH}/lib" } +build_constantine() { + echo "#############################" + echo "####### build constantine ####" + echo "#############################" + + # Skip if OSARCH is linux-gnu-aarch64 + if [[ "$OSARCH" == "linux-gnu-aarch64" ]]; then + echo "Skipping build for OSARCH: ${OSARCH}" + return + fi + + cd "$SCRIPTDIR/constantine/constantine" + + # delete old build dir, if exists + rm -rf "$SCRIPTDIR/constantine/build" || true + mkdir -p "$SCRIPTDIR/constantine/build/${OSARCH}/lib" + + export PATH=$HOME/.nimble/bin:$PATH + + # Build the constantine library + export CTT_LTO=false + nimble make_lib + + cd "$SCRIPTDIR/constantine/" + + # Compile the native library + if [[ "$OSTYPE" == "darwin"* ]]; then + cp "$SCRIPTDIR/constantine/constantine/lib/libconstantine.dylib" "$SCRIPTDIR/constantine/build/${OSARCH}/lib/" + clang -I"${JAVA_HOME}/include" -I"${JAVA_HOME}/include/darwin" -shared -o "$SCRIPTDIR/constantine/build/${OSARCH}/lib/libconstantineeip196.jnilib" ethereum_evm_precompiles.c -Iconstantine/include -I. -Lconstantine/lib -lconstantine + elif [[ "$OSTYPE" == "linux-gnu"* ]]; then + cp "$SCRIPTDIR/constantine/constantine/lib/libconstantine.so" "$SCRIPTDIR/constantine/build/${OSARCH}/lib/" + clang -I"${JAVA_HOME}/include" -I"${JAVA_HOME}/include/linux" -fPIC -shared -o "$SCRIPTDIR/constantine/build/${OSARCH}/lib/libconstantineeip196.so" ethereum_evm_precompiles.c -Iconstantine/include -I. -Lconstantine/lib -lconstantine + else + echo "Unsupported OS/architecture: ${OSARCH}" + exit 1 + fi +} + + build_blake2bf build_secp256k1 build_arithmetic @@ -326,6 +365,7 @@ build_bls12_381 build_ipa_multipoint build_secp256r1 build_gnark +build_constantine build_jars diff --git a/constantine/build.gradle b/constantine/build.gradle new file mode 100644 index 00000000..92285205 --- /dev/null +++ b/constantine/build.gradle @@ -0,0 +1,145 @@ +plugins { + id 'java-library' + id 'maven-publish' + id 'com.jfrog.artifactory' version '5.2.3' +} + +repositories { + mavenCentral() +} + +dependencies { + implementation 'net.java.dev.jna:jna:5.12.1' + testImplementation 'com.google.guava:guava:31.1-jre' + testImplementation 'io.tmio:tuweni-bytes:2.4.2' + testImplementation 'junit:junit:4.13.2' +} + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } +} + +tasks.withType(JavaCompile) { + options.encoding = 'UTF-8' +} + +def osName = System.getProperty('os.name').toLowerCase() +def osArch = System.getProperty('os.arch') +def libDir + +if (osName.contains('mac') && osArch.contains('aarch64')) { + libDir = 'darwin-aarch64' +} else if (osName.contains('mac')) { + libDir = 'darwin-x86-64' +} else if (osName.contains('linux') && osArch.contains('aarch64')) { + libDir = 'linux-gnu-aarch64' +} else { + libDir = 'linux-gnu-x86_64' +} + +task libCopy(type: Copy) { + from "build/${libDir}/lib/" + into "build/resources/main/lib/${libDir}" +} + +processResources.dependsOn libCopy + +task compileJavaSource(type: Exec) { + description = 'Compiles the Java source files' + commandLine 'javac', '-d', 'build', 'src/main/java/org/hyperledger/besu/nativelib/constantine/LibConstantineEIP196.java' + dependsOn libCopy +} + +tasks.named('test', Test) { + description = 'Runs the Java tests' + useJUnit { + include '**/*Test.class' + } + environment 'LD_LIBRARY_PATH', "${System.env.LD_LIBRARY_PATH}:build/resources/main/lib/${libDir}" + jvmArgs = ["-Djava.library.path=build/resources/main/lib/${libDir}"] + dependsOn compileJavaSource +} + +jar { + archiveBaseName = 'besu-native-constantine' + includeEmptyDirs = false + manifest { + attributes( + 'Specification-Title': archiveBaseName, + 'Specification-Version': project.version, + 'Implementation-Title': archiveBaseName, + 'Implementation-Version': project.version, + 'Automatic-Module-Name': 'org.hyperledger.besu.nativelib.constantine' + ) + } +} + +task sourcesJar(type: Jar, dependsOn: classes) { + archiveBaseName = 'besu-native-constantine' + archiveClassifier = 'sources' + from sourceSets.main.allSource +} + +task javadocJar(type: Jar, dependsOn: javadoc) { + archiveBaseName = 'besu-native-constantine' + archiveClassifier = 'javadoc' + from javadoc.destinationDir +} + +publishing { + publications { + mavenJava(MavenPublication) { + groupId "org.hyperledger.besu" + artifactId 'constantine' + version "${project.version}" + + from components.java + artifact sourcesJar + artifact javadocJar + + pom { + name = "Besu Native - ${project.name}" + description = 'Adapter for native constantine library' + url = 'http://github.com/hyperledger/besu-native' + licenses { + license { + name = 'The Apache License, Version 2.0' + url = 'http://www.apache.org/licenses/LICENSE-2.0.txt' + } + } + scm { + connection = 'scm:git:git://github.com/hyperledger/besu-native.git' + developerConnection = 'scm:git:ssh://github.com/hyperledger/besu-native.git' + url = 'https://github.com/hyperledger/besu-native' + } + } + } + } +} + +def artifactoryUser = project.hasProperty('artifactoryUser') ? project.property('artifactoryUser') : System.getenv('ARTIFACTORY_USER') +def artifactoryKey = project.hasProperty('artifactoryApiKey') ? project.property('artifactoryApiKey') : System.getenv('ARTIFACTORY_KEY') +def artifactoryRepo = System.getenv('ARTIFACTORY_REPO') ?: 'besu-maven' +def artifactoryOrg = System.getenv('ARTIFACTORY_ORG') ?: 'hyperledger' + +artifactory { + contextUrl = "https://hyperledger.jfrog.io/${artifactoryOrg}" + publish { + repository { + repoKey = artifactoryRepo + username = artifactoryUser + password = artifactoryKey + } + defaults { + publications('mavenJava') + publishArtifacts = true + publishPom = true + } + } +} + +test { + useJUnit() +} \ No newline at end of file diff --git a/constantine/constantine b/constantine/constantine new file mode 160000 index 00000000..b138162f --- /dev/null +++ b/constantine/constantine @@ -0,0 +1 @@ +Subproject commit b138162fa2dd8206d411d39e9dd25b49d458c9dc diff --git a/constantine/ethereum_evm_precompiles.c b/constantine/ethereum_evm_precompiles.c new file mode 100644 index 00000000..5c4089be --- /dev/null +++ b/constantine/ethereum_evm_precompiles.c @@ -0,0 +1,51 @@ +#include +#include "ethereum_evm_precompiles.h" +#include +#include + +void printByteArray(const char* label, const byte* array, size_t len) { + printf("%s: [", label); + for (size_t i = 0; i < len; i++) { + printf("%02x", array[i]); + if (i < len - 1) { + printf(", "); + } + } + printf("]\n"); +} + +JNIEXPORT jint JNICALL Java_org_hyperledger_besu_nativelib_constantine_LibConstantineEIP196_ctt_1eth_1evm_1bn254_1g1add(JNIEnv *env, jobject obj, jbyteArray jr, jint r_len, jbyteArray jinputs, jint inputs_len) { + jbyte *r = (*env)->GetByteArrayElements(env, jr, NULL); + jbyte *inputs = (*env)->GetByteArrayElements(env, jinputs, NULL); + + ctt_evm_status status = ctt_eth_evm_bn254_g1add((byte *)r, (ptrdiff_t)r_len, (const byte *)inputs, (ptrdiff_t)inputs_len); + + (*env)->ReleaseByteArrayElements(env, jr, r, 0); + (*env)->ReleaseByteArrayElements(env, jinputs, inputs, 0); + + return (jint)status; +} + +JNIEXPORT jint JNICALL Java_org_hyperledger_besu_nativelib_constantine_LibConstantineEIP196_ctt_1eth_1evm_1bn254_1g1mul(JNIEnv *env, jobject obj, jbyteArray jr, jint r_len, jbyteArray jinputs, jint inputs_len) { + jbyte *r = (*env)->GetByteArrayElements(env, jr, NULL); + jbyte *inputs = (*env)->GetByteArrayElements(env, jinputs, NULL); + + ctt_evm_status status = ctt_eth_evm_bn254_g1mul((byte *)r, (ptrdiff_t)r_len, (const byte *)inputs, (ptrdiff_t)inputs_len); + + (*env)->ReleaseByteArrayElements(env, jr, r, 0); + (*env)->ReleaseByteArrayElements(env, jinputs, inputs, 0); + + return (jint)status; +} + +JNIEXPORT jint JNICALL Java_org_hyperledger_besu_nativelib_constantine_LibConstantineEIP196_ctt_1eth_1evm_1bn254_1pairingCheck(JNIEnv *env, jobject obj, jbyteArray jr, jint r_len, jbyteArray jinputs, jint inputs_len) { + jbyte *r = (*env)->GetByteArrayElements(env, jr, NULL); + jbyte *inputs = (*env)->GetByteArrayElements(env, jinputs, NULL); + + ctt_evm_status status = ctt_eth_evm_bn254_ecpairingcheck((byte *)r, (ptrdiff_t)r_len, (const byte *)inputs, (ptrdiff_t)inputs_len); + + (*env)->ReleaseByteArrayElements(env, jr, r, 0); + (*env)->ReleaseByteArrayElements(env, jinputs, inputs, 0); + + return (jint)status; +} \ No newline at end of file diff --git a/constantine/ethereum_evm_precompiles.h b/constantine/ethereum_evm_precompiles.h new file mode 100644 index 00000000..74529b4d --- /dev/null +++ b/constantine/ethereum_evm_precompiles.h @@ -0,0 +1,37 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class org_hyperledger_besu_nativelib_constantine_LibConstantineEIP196 */ + +#ifndef _Included_org_hyperledger_besu_nativelib_constantine_LibConstantineEIP196 +#define _Included_org_hyperledger_besu_nativelib_constantine_LibConstantineEIP196 +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_hyperledger_besu_nativelib_constantine_LibConstantineEIP196 + * Method: ctt_eth_evm_bn254_g1add + * Signature: ([BI[BI)I + */ +JNIEXPORT jint JNICALL Java_org_hyperledger_besu_nativelib_constantine_LibConstantineEIP196_ctt_1eth_1evm_1bn254_1g1add + (JNIEnv *, jobject, jbyteArray, jint, jbyteArray, jint); + +/* + * Class: org_hyperledger_besu_nativelib_constantine_LibConstantineEIP196 + * Method: ctt_eth_evm_bn254_g1mul + * Signature: ([BI[BI)I + */ +JNIEXPORT jint JNICALL Java_org_hyperledger_besu_nativelib_constantine_LibConstantineEIP196_ctt_1eth_1evm_1bn254_1g1mul + (JNIEnv *, jobject, jbyteArray, jint, jbyteArray, jint); + +/* + * Class: org_hyperledger_besu_nativelib_constantine_LibConstantineEIP196 + * Method: ctt_eth_evm_bn254_pairingCheck + * Signature: ([BI[BI)I + */ +JNIEXPORT jint JNICALL Java_org_hyperledger_besu_nativelib_constantine_LibConstantineEIP196_ctt_1eth_1evm_1bn254_1pairingCheck + (JNIEnv *, jobject, jbyteArray, jint, jbyteArray, jint); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/constantine/src/main/java/org/hyperledger/besu/nativelib/constantine/LibConstantineEIP196.java b/constantine/src/main/java/org/hyperledger/besu/nativelib/constantine/LibConstantineEIP196.java new file mode 100644 index 00000000..c919d4ad --- /dev/null +++ b/constantine/src/main/java/org/hyperledger/besu/nativelib/constantine/LibConstantineEIP196.java @@ -0,0 +1,42 @@ +package org.hyperledger.besu.nativelib.constantine; + +public class LibConstantineEIP196 { + static { + System.loadLibrary("constantineeip196"); + } + + public native int ctt_eth_evm_bn254_g1add(byte[] r, int r_len, byte[] inputs, int inputs_len); + public native int ctt_eth_evm_bn254_g1mul(byte[] r, int r_len, byte[] inputs, int inputs_len); + public native int ctt_eth_evm_bn254_pairingCheck(byte[] r, int r_len, byte[] inputs, int inputs_len); + + public static void loadNativeLibrary() { + System.loadLibrary("constantineeip196"); + } + + public byte[] add(byte[] inputs) { + byte[] result = new byte[64]; + int status = ctt_eth_evm_bn254_g1add(result, result.length, inputs, inputs.length); + if (status != 0) { + throw new RuntimeException("ctt_eth_evm_bn254_g1add failed with status: " + status); + } + return result; + } + + public byte[] mul(byte[] inputs) { + byte[] result = new byte[64]; + int status = ctt_eth_evm_bn254_g1mul(result, result.length, inputs, inputs.length); + if (status != 0) { + throw new RuntimeException("ctt_eth_evm_bn254_g1mul failed with status: " + status); + } + return result; + } + + public byte[] pairingCheck(byte[] inputs) { + byte[] result = new byte[32]; + int status = ctt_eth_evm_bn254_pairingCheck(result, result.length, inputs, inputs.length); + if (status != 0) { + throw new RuntimeException("ctt_eth_evm_bn254_pairingCheck failed with status: " + status); + } + return result; + } +} \ No newline at end of file diff --git a/constantine/src/test/java/org/hyperledger/besu/nativelib/constantine/ConstantineEIP196G1AddTest.java b/constantine/src/test/java/org/hyperledger/besu/nativelib/constantine/ConstantineEIP196G1AddTest.java new file mode 100644 index 00000000..23620010 --- /dev/null +++ b/constantine/src/test/java/org/hyperledger/besu/nativelib/constantine/ConstantineEIP196G1AddTest.java @@ -0,0 +1,66 @@ +package org.hyperledger.besu.nativelib.constantine; + +import com.google.common.io.CharStreams; +import org.apache.tuweni.bytes.Bytes; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.stream.Collectors; + +import static java.nio.charset.StandardCharsets.UTF_8; +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +@RunWith(Parameterized.class) +public class ConstantineEIP196G1AddTest { + + @Parameterized.Parameter(0) + public String input; + @Parameterized.Parameter(1) + public String expectedResult; + @Parameterized.Parameter(2) + public String expectedGasUsed; + @Parameterized.Parameter(3) + public String notes; + + @Parameterized.Parameters + public static Iterable parameters() throws IOException { + return CharStreams.readLines( + new InputStreamReader( + ConstantineEIP196G1AddTest.class.getResourceAsStream("/eip196_g1_add.csv"), UTF_8)) + .stream() + .map(line -> line.split(",", 4)) + .collect(Collectors.toList()); + } + + @Test + public void shouldCalculate() { + if ("input".equals(input)) { + // skip the header row + return; + } + LibConstantineEIP196 constInstance = new LibConstantineEIP196(); + byte[] inputBytes = Bytes.fromHexString(this.input).toArrayUnsafe(); + + byte[] result = new byte[64]; + int status = constInstance.ctt_eth_evm_bn254_g1add(result, result.length, inputBytes, inputBytes.length); + + Bytes expectedComputation = expectedResult == null ? null : Bytes.fromHexString(expectedResult); + if (status != 0) { + assertNotNull("Notes should not be empty", notes); + assertNotEquals("Status should not be success", 0, status); + assertArrayEquals("Result should be empty", new byte[64], result); + } else { + Bytes actualComputation = Bytes.wrap(result); + if(actualComputation.isZero()) actualComputation = Bytes.EMPTY; + assertEquals("Computed result should match expected result", expectedComputation, actualComputation); + assertTrue("Notes should be empty", notes.isEmpty()); + } + } +} \ No newline at end of file diff --git a/constantine/src/test/java/org/hyperledger/besu/nativelib/constantine/ConstantineEIP196G1MulTest.java b/constantine/src/test/java/org/hyperledger/besu/nativelib/constantine/ConstantineEIP196G1MulTest.java new file mode 100644 index 00000000..e08c05ca --- /dev/null +++ b/constantine/src/test/java/org/hyperledger/besu/nativelib/constantine/ConstantineEIP196G1MulTest.java @@ -0,0 +1,68 @@ +package org.hyperledger.besu.nativelib.constantine; + +import com.google.common.io.CharStreams; +import org.apache.tuweni.bytes.Bytes; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.stream.Collectors; + +import static java.nio.charset.StandardCharsets.UTF_8; +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + + +@RunWith(Parameterized.class) +public class ConstantineEIP196G1MulTest { + + @Parameterized.Parameter(0) + public String input; + @Parameterized.Parameter(1) + public String expectedResult; + @Parameterized.Parameter(2) + public String expectedGasUsed; + @Parameterized.Parameter(3) + public String notes; + + @Parameterized.Parameters + public static Iterable parameters() throws IOException { + return CharStreams.readLines( + new InputStreamReader( + ConstantineEIP196G1MulTest.class.getResourceAsStream("/eip196_g1_mul.csv"), UTF_8)) + .stream() + .map(line -> line.split(",", 4)) + .collect(Collectors.toList()); + } + + @Test + public void shouldCalculate() { + if ("input".equals(input)) { + // skip the header row + return; + } + LibConstantineEIP196 constInstance = new LibConstantineEIP196(); + byte[] inputBytes = Bytes.fromHexString(this.input).toArrayUnsafe(); + + byte[] result = new byte[64]; + int status = constInstance.ctt_eth_evm_bn254_g1mul(result, result.length, inputBytes, inputBytes.length); + + Bytes expectedComputation = expectedResult == null ? null : Bytes.fromHexString(expectedResult); + + if (status != 0) { + assertNotNull("Notes should not be empty", notes); + assertNotEquals("Status should not be success", 0, status); + assertArrayEquals("Result should be empty", new byte[64], result); + } else { + Bytes actualComputation = Bytes.wrap(result); + if(actualComputation.isZero()) actualComputation = Bytes.EMPTY; + assertEquals("Computed result should match expected result", expectedComputation, actualComputation); + assertTrue("Notes should be empty", notes.isEmpty()); + } + } +} \ No newline at end of file diff --git a/constantine/src/test/java/org/hyperledger/besu/nativelib/constantine/ConstantineEIP196PairingCheckTest.java b/constantine/src/test/java/org/hyperledger/besu/nativelib/constantine/ConstantineEIP196PairingCheckTest.java new file mode 100644 index 00000000..6a4ed3ad --- /dev/null +++ b/constantine/src/test/java/org/hyperledger/besu/nativelib/constantine/ConstantineEIP196PairingCheckTest.java @@ -0,0 +1,65 @@ +package org.hyperledger.besu.nativelib.constantine; + +import com.google.common.io.CharStreams; +import org.apache.tuweni.bytes.Bytes; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.stream.Collectors; + +import static java.nio.charset.StandardCharsets.UTF_8; +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +@RunWith(Parameterized.class) +public class ConstantineEIP196PairingCheckTest { + + @Parameterized.Parameter(0) + public String input; + @Parameterized.Parameter(1) + public String expectedResult; + @Parameterized.Parameter(2) + public String expectedGasUsed; + @Parameterized.Parameter(3) + public String notes; + + @Parameterized.Parameters + public static Iterable parameters() throws IOException { + return CharStreams.readLines( + new InputStreamReader( + ConstantineEIP196PairingCheckTest.class.getResourceAsStream("/eip196_pairing.csv"), UTF_8)) + .stream() + .map(line -> line.split(",", 4)) + .collect(Collectors.toList()); + } + + @Test + public void shouldCalculate() { + if ("input".equals(input)) { + return; + } + LibConstantineEIP196 constInstance = new LibConstantineEIP196(); + byte[] inputBytes = Bytes.fromHexString(this.input).toArrayUnsafe(); + + byte[] result = new byte[32]; + int status = constInstance.ctt_eth_evm_bn254_pairingCheck(result, result.length, inputBytes, inputBytes.length); + + Bytes expectedComputation = expectedResult == null ? null : Bytes.fromHexString(expectedResult); + + if (status != 0) { + assertNotNull("Notes should not be empty", notes); + assertNotEquals("Status should not be success", 0, status); + assertArrayEquals("Result should be empty", new byte[32], result); + } else { + Bytes actualComputation = Bytes.wrap(result); + assertEquals("Computed result should match expected result", expectedComputation, actualComputation); + assertTrue("Notes should be empty", notes.isEmpty()); + } + } +} \ No newline at end of file diff --git a/constantine/src/test/java/org/hyperledger/besu/nativelib/constantine/LibConstantineEIP196Test.java b/constantine/src/test/java/org/hyperledger/besu/nativelib/constantine/LibConstantineEIP196Test.java new file mode 100644 index 00000000..0a0471d7 --- /dev/null +++ b/constantine/src/test/java/org/hyperledger/besu/nativelib/constantine/LibConstantineEIP196Test.java @@ -0,0 +1,45 @@ +package org.hyperledger.besu.nativelib.constantine; + +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class LibConstantineEIP196Test { + private LibConstantineEIP196 constInstance; + + @Before + public void setUp() { + LibConstantineEIP196.loadNativeLibrary(); + constInstance = new LibConstantineEIP196(); + } + + @Test + public void testG1Add() { + byte[] inputs = new byte[128]; + + byte[] result = constInstance.add(inputs); + assertNotNull("Result array should not be null", result); + assertEquals("Result array length should be 64", 64, result.length); + } + + @Test + public void testG1Mul() { + byte[] inputs = new byte[96]; + + byte[] result = constInstance.mul(inputs); + assertNotNull("Result array should not be null", result); + assertEquals("Result array length should be 64", 64, result.length); + } + + @Test + public void testPairingCheck() { + byte[] inputs = new byte[0]; // Empty input + + byte[] result = constInstance.pairingCheck(inputs); + assertNotNull("Result array should not be null", result); + assertEquals("Result array length should be 32", 32, result.length); + assertEquals("The last byte of the result should be 1", 1, result[31]); + } +} \ No newline at end of file diff --git a/constantine/src/test/resources/eip196_g1_add.csv b/constantine/src/test/resources/eip196_g1_add.csv new file mode 100644 index 00000000..6626a8f0 --- /dev/null +++ b/constantine/src/test/resources/eip196_g1_add.csv @@ -0,0 +1,109 @@ +input,result,gas,notes +1b43c36e6eb9566ae50c78f79802a80a963cf4317079c9e201361b1afbd64d2b2796ffa55aaf5946e40b8038cda20238c53f328d5e4150287564eb08ce1efa590d4d3c9a95606d838edb0b494a64d5ad5933335cd7acf5ee9409492135b44fed2d02a128bfb4cb61db495d5389feba0c4943e8c8c936acf7231fc8edefb619b5,29a99e2465491ddb57b131ea6d0469f4faaa4202bf870b3e82365b9c3a59cf8227d26a8780d9d0c30452f13d9673e2d9cae926a2158b62f8cf4804adaa112e98,150, +0f85a508df37969f8c8cbbca94dee3e16486925e641f30eb28c6b1e3b245f65b2ee909d033107923c60ebb62d1df187876ce7572389ae92ee8550944afa5744a2e5edfb879b2e339b57cdac7807f7db63ced81cac249b3b3f3c9c9654ef18d90271d8f777fbdd5b835281abc507d5abf5ff4d1246b46f4b67eaf5225bf61740a,0dc0cbe0fb51f403891c65123b93565a6337ed8db5514bf32a7e378fb76fdeac0d0c8408bf954b22aef7860222e2361585db61f5316ea58e2a2d864fe71773b2,150, +2916f9ec30acee03708b50237ea90d28b78d7c3e50a4291998a951c034db0f1d0ba73873480a5340e1a75053d189a74e5aa90834e5b05b346a3d642c425efacf1b569250593ccd6b1996da21ac3921d187c3521eb6e30cfaaec2e87ca0a539fa23688cecb7f844d091cf789f38efcab6e627d1617cf754f499eadca118f49f30,0973c24ad66f533ebb28d2c8767578abb13178204a86e47cc507743fa0cc02ca0f2b48444a4f0710749836b15b1ce12e7ab653a4c7f5292a652949c05804e4fb,150, +2e995ae31702e2d6392c6e4c9cba4d77d2499083999aac05ed9deee839a0116a13e92dfc69d809590ae3bd5623a535f9d24d6b4b12df77c19e76d42c4b03b1a21c93c96f17ad1b0ca279770fdc561a9abc28cae2999dc6b6bb87cca418c022950c6527a1f7fa3b4e3ebfaf45205bf3b404a8b7399e8ff50fbaf911018329013e,18ed817ef7e0a3e7f9e2eef6e5a4e50ec956d19421861bb683692400ebfe624d22d6eb16872cdbd2cd1ac3511c5ea6cd824891e1ea382ec8a2d7ded9596edc78,150, +07de5f1ebff51c81ba850980e0699714841c1edac6d06aa6868a16748580bea32db39aa2355192f40ec01d32c036ba09117e2042994b427c406821d0331914dd1bfdd4646e8889835a0292ce43d8bb2ad93cbaa36dccbbd04abf51e8d38b43aa03cf84893c37329c17d755d08def8bb7e0ab9059c7620e4e8a2bfeebb4c31ae7,0171c82f0c346d973e8c1376513ccb6bb137dab020934a598718111c22c296272923bbd637d7e503cf7d98ea642813acb3cd16a664cf35fbda2afb5122f0f49d,150, +0701805fb427d00ce36bbd6b11e7f882648c1bc327bf2714df4dbb610a24105c25f044524bc4b1ae5a22b5908d920ca29f9296b8cc0fa962a5f4520129f924152319b34306bf3d7d4ba16c95afdb78ad51819dd90f09df5a98755f42ffdc485303e6b28553c89254875e2076c35f3732e265c043dfdee455f3ffe6735d382dd5,131eab07c7f2689b659819ff318169223087f75d94b9d76821917e79e10d022b22d3fa1f8062fa672ba1ab8fc1cc0628868a909544fd9a17e362e8174025e03d,150, +184df90117d858501ec7c0d69d8dd8050daa6ce49f50445a763722daedf2e1d82b55b25fd087ca81ca13f7bcb38ec9fb455970baa031d79c2769f60201ea5bca19679c6815ffa07b67f8873c77e0e852d563eb2635bed5a2f8ab356f88f10d380306235358fe16da3bdf9d03b330208d8e1c3dd07bbcc0fc073db0eb570b0b88,2941b8b794382ca5f56a64efc256bac7fa2a8c4190219a256bf658814f70856c1cddb67cf106148a385a12a4735def9a9cbfe7038fc0c1906999e99041866773,150, +1e0a1d2d495adb45e5eae39ef24cca47ac2b4248137807b4e2de89f06c1448932c8ad2f08d6aaaf9aa4f87f0548d28dfb2d48712e1c03727fc595234137deed026529d24a3542bac4878cf1d6b20167ccba437be0cb59e615a0c11757807c2622cddfa93abce6d8c70bc15b7d174fce561768b943ff5407e2996b3d811fc166f,03f3868ed52fbb8c09b77b3fabb82b7e6909f4b5d2899efe5da1e6001f07a3120eed515d37f787498022eaddaadf3b87b4dcd52f37a54f4cf80b45892c310d56,150, +2d7c31c2b12d7b09ae25b4caab2798803314c3ec7cdcfd0de12f606dbe515bc918316a80810aa145f60aa2d74370c189def59277c3e1d99faf1b252280417d3c2077c76a9d1379fbfdc58a8a7b7726fb1ab64aa04e54e5634f5dc26d7d2adb432543731991d1ef81635ecd99bde03ba452c62ce55a4b1cce6aca325692ed4d09,2884f8feb4a88eb7a9447ecf398268b0064a9c3f14ea019342fcd7be0caddf020ea033d2405659afa7a8ceb89ac64a56ef9b424f346826e56024a179d377d27d,150, +04fe4095cebcfcefb125e5887ec727ce090020746e56de988c677dbfa7b54b770d3ccb5605e1c74fefdebd836d157c05ce7e9f5ab1ed651f264755149a62f8320c8facf125d9514f764a2663412481bf61691e6c46b5af51939fcd0fa7923fbc1794bdf99cc08fe10a316ca1ba05b49cfe18f526863dbe622885368ac99f992e,020a596e49168d156658e6b925c0bfafbf8b451f638dc07569238ea09f2f88e52880ddfe842fb73961721d8edf87101fbe992c5a951fd7de630b9025d22aa74a,150, +3032d14c79576410f97766072284e6fa2386e6b1d9aff5d3eae26c7cdd3ed33c237fcf14453950ebc55e8052fbca0d3671fe5dc27c0069ab1647ebcad3695fa11f69b98d5763bf896bc4bbad4a8ff73801599202c4d3c522d335578dfe7a0f1123382707719546857c230e12690ee9f3c81ef4bc61fc3cbb8e4fefb3505d969b,1726f177e513cd587608b96c218331f39274680af0794577acc259ff69e221d20752f47c39b508fb3710b0fc6ca4fc3c1965de68c82240f78da6354efe2e5705,150, +198de67c3839d3153d508bbd668e97d203490ffeade6eeb46771524073a9c37d2568a7d7ce6f9b0f66fb8c3da393801e0d9db3d66126f6a41be2a257c3b1fa8c18d025dbd4c5b730d4074762a9c824e38c81a4b8a565cdd7717ac7cf8d6f55c22242275db8ff629129da597487ae6849218b3a9a27d02408d5d0701b451f2aaf,1a09c8ec6416903031e6a9249b7df338ee4cbc79f9e8a105748eec1b1e4c22d0156b62706790cb37ed0b2973604ab1d2f5128a4415bfe79ff45b871a48e25597,150, +24c1273f9d9875963aab03725eede38a88795141879e973f74cd08c1a12462d11cb77f160fccdefd1c8243cb9b3bf4027374ddce193249750e260ea4928fc20414bce6143b7b96101e0e33dcabeec47b94b3f944fc407a14d499b90b6de663a42f4289d63bcafbe6c1190e8e1dbc1e549ee92853b0dc9659b6508d36ed28ee6e,1a23ec7a2995178cf8b3ff26c003f0c38b7331bc6e7961c4fb8af24d138834981d896cbf9f5229f6cfc14b297030b2477460a352ff249fcc591313e60a2aaa5c,150, +19ecddfcdb40944b84c208a1cf150154a20fbaf0fc9a6c232debf8042e606bcc11d473b3deab044b750542778f08984926a4ef7f42a3779816e86b9e32ccc18b165bc60e24f6fa442818301858db34650b79fee3ba6a749256e0458167ca4de9241382cb7601286fb8d721bcabdcffaa2a88021d75e6bd081f674d6f6a11f01b,1ec4158789023117235536ff1c9c09bb8cd7684efe588201ddaf0708f9850c422177971f8ef20d6d47566ba029c306d4c70a7954b9f24a5ced76009172ee3029,150, +1a33156f9252af7df4770746b553a3156a45572e6c46d2ffc97e6e940212c49f0487e5b0fd783d80fc362e6b453bae6ed77b02054d8adba9a3964d5d7357dbe107fef3e9f3fd3da26e6a083c86967db56a0d27ac94314803defebaea6fb27269264f2891c6cabacc9fda8b07c9f8d3df6050c24603f8532335d28662666710ce,1025ceac501fc179963465bc28b7ad402fdbf7a8bc1ce7de3043a6e9de690c62234dcd90fa04d2188f9c2011de1a672602a2a1811f92645b13913e3f54ffba8a,150, +0c94f9c195184421ae83539a0f8a16388310615f39a827a1778486173f10bf500414ad754cb9233b7d69ac4fea1f97c71c6bd73369a8a7a1cebd6edd87e06745018529c254400ab8a6a6955b30c6d92bb42123f41a97242a219cf516be8e91df2c8365b74e7a59141137b95774dff1b16d8601976779b920cde2df66669cadcc,044022cadca68169655b761668163a74ac9019c3dcddfb379fd0a8dc98aaa11710a50d79a83b64377671d43fe6a642288c644323d6e891d70b04a1f89dbc7cd3,150, +1db047a190dd76d1402e6ad3c7fc9c065d21c94df397ad495b643ea46c0e5d0306c9b0f6e490d25c7b608252a498a21f5f1858ce93f4e83063eb9b55bc7c31f90cc836806a05ed2738a23fdf38641337fb0e4f1238ac5c3d81d2a7ee84ed20b40755c2cf20b2d02196424914de43bd5c9bb06278af420c297b67e14fef6f3a95,2ce69fca813bba630e3f8c52eec28a3d8c1021ea9cb71d916b3d3d63d04b81811ed008458c5dc60970697270e68919edb026a1a602384ab924e235c3d539bad2,150, +18373a450112cd1560e92fb06f87d504c31c3fe8d06433690459edc804cf78fe13fe282e94d91192ce34fd695b76637b1ba74ccf8fc78d51e5bfadc2806b3b000d6297a6dcf15b5293f274f879d23be0e5cf1fa477e9f9791ef169aa8a6ec0d707e497e125276b0ba3cad5cc5be7d26ac8907e36b75cbb3276bfad81c166adf5,2709f5afb3d89ef51e7d10f13f0e7c02b76b10a8873fafba44784d77d916542c03c9c6951ed0cadd81e861d8b06337392a67efd1df60af9e2a12ae047096d72c,150, +282dc926ac36aaeafa1714604e42d10aa9a3e97fe81f7b0fc4ec3ce6c27bf5ee2a380e99b5b0c929428e357f8518f64596f39ce291e4c8eeb36860de334c71e327dd6898df4692c7bdf0daf18de19dc5bdc7ebb86e0ccbd3130d23c9385afeab2bf419e3f3cd64f1aa0a7e23607af5dd6bbe377b8ecdc998957c3dbe1bdc977d,253b83cb9e3bbaabc7dafba9bdf112b7a66a2bb6ecd1fcc1ff9959a18013880c045f1e493ce531a5b30e0874d7022bb4dcd04e54a2c1eb3a51a3b743d06f903e,150, +1bb04679180181ffc91b76a7220e1bfb481ef49a4697faf0f497f755c1e1b5d322a77b51fb772699b50cfe89a33286e6bc20c498cb169e823c035d90ca9e9d0409fec08dfa7383dd54f258c00b7627b0b81dff149b0fcbc39c3bf33de28dcfca0184e7bef0b4058dcbc07bd3f3f3bd0164451320f04f3904ac18555ae672b6ee,1d32b81acd00a23ccd07c1015f73f243c52be83bc779544ec1b9cb88ae85fa6a01142e6345340734316f2e33c13c0bdd0f2153f87cd196cec7714200e633799a,150, +29fe43bd274af34520043171a9d588e5a2663f13a7e850b77d74ec040fe4c38426d63acca4b53399fe0bc9a224d664932ac29745363e943e09e8b4328153ff2013e912e7fdcfb10ab8bca49ee77f83e36fe811eb1ba67add05cd2f691434f66a138213806b4b5a1d40ee7756c8c92935225f2a2c82450e433054eb43593f223a,27bbc91552c0c51f8074f0e943921554556fd6fb612bb9d9431217477a9c74681cd1ef2e33342d3cab18cbe55e6c35e50b679d5bd1dec29c95f9f1cde09bc5ba,150, +0689a99770abf5678aa1554214acd85ff8b772097fe8aca549732c635a1b548609f0fa33282ce4f33b967e483f916e8292d8bd97944bfe93606d76884ae1c3872a034fc365e340ec3e1dfa3e0644ce982d605e8235861df6e633d4af28394a981237d0d227c577f4cb460d745348be745a65abaa8270faa24cbe203bd37b0701,22fe52e7d928c8393f3f1cd4b25da082beb263a7be63a2615ce31245d58f35e90cfe0ac923ff370dcc8760af0a41d3b9e560cf6185a50924856ddba5a41b33dc,150, +18fd6300e01d66d39c16b6bd0429963e5b71a43509bfe55fc6f51cae5b636f73221e8da0da6a43ee44d59bd0869e32cdf9fe608223dcdd0c0aa80127b700ecf42309868fdba6e0d93b998e704cc0d6dfcc61a6f0523660714e27ff57ba348707041c91f774846f52e92bd510ca05c2c80361009e5f458fb37f8c66fb6df00958,102d40056d29d281eb9a8374cceb27d361e6fef8131dd5df37fe9be8bac01dfa04f9f50b2c25157349ff8e35ceb2a803212b1744c191f8eaebc67c96f36cb4a0,150, +30554ba407dc2f30cb41818994ce90778f4b92e6d56cb7642ab3bf3b5ea7eee62c44fd91c2872e9a2dbce6def4d31952e81f3f2403dfa3ea42f4f2553f628b891e5202992a7a7c073a8b31d4f03e3dfd593ab769a7f7a343d5595eea80d9492126ae21a8e8bd8bd2dbdfdb5ae6912ee6e6b01a4dcc0400262baca7bfe9d20788,15c11c1927d205f7f779e2885597f41db83525a3d9347de32cb178a4c6da16aa0d2768dd574030e1b0753559991c855cf5150e412e9e5397f960a7daebe6e5cc,150, +05f1236d6198c674608d83435a232026d3aec36a91e1b2c176cd9acebe050f8d1683e0e4c6dc757cd0a3c0beed154e123fe0013be96e146d80911859d0953ac3123a5d746c590e9373b65caf722ba4a793b100faf549bec3159a02a5cdc90a0a2bb1cd33cb84fd2a7c7d98c9c3cfe74f4ca0bff4fd48f59fdc18fdb2c26c60b6,10293d0cf70537e5de2bdafd34aff832b37e899a35b7b30aca0e5e2f5bdc922e2ba6c9f967e250eac4365c5f65d36ad11748cb1a6535ade051560d00a98c9699,150, +28463bca322955cbfca422d8c82f00cbd306fc45440b62dfdcb8bdbcdde5045725715ddd4f204c8baad8eb6aacb8b52d3c82bc80d077baa2af7b9b39cb871ce219d06310c7d8affe260aa1f2d1ced2689c3c5fc301cff8fc7f1a7e6b26cb6dd3240becae03a1e5bb896faa0def0a5546b0c3219713782d6cdc95eae17c7dd42f,110aeadb683476df113c814924df5b578af16e1a7d6630d5c59e88ff4aefb75c11faa3dbb198b30660a44341db3fc6823e3f10d822351ffde673c558921ed8f6,150, +02e5f473e89236a3d54cc1bead84099e815a685e14a93d9415f0865f37e57e4b1e50fafdb4b5404684f74a3e7f8274d3c2ade750733f19f3d949745a843bd2482fad2ab47345a1decba745670ae8fa18e82e0c562f246f8cc254301041754f3c292b3b25bdf5d86e4b928fb082f298e0d40a096c1efa528e697501765c8d128c,1923a517fa1c4d72de6a23e1ef9832b581e3c3cdea0d66e82359ddb34dce60b31019928f6df96d87195e53c1d07a1ca920141d2877b696a831637d6a5f7da165,150, +1d301838aa5a38d0fc6eefb006638e62371c703f5df5fbe1ef929bad6a87712525a83a18a36d07b972f1915700e6a7732197cebcc04c74c691346107d886eb1f0dfc3d8a50ca1ef4d930b35c82cb30f4c997a78c63d4e5339bccd2c71ad962842e1c1a43c4386b83fe50438db0e6922ac117ca78679817ac7c2a78d9a9c5e3e3,0a73c0da6adaebf2f26a2516524e7209dc31f4ceda97311458b3b22c08bce03b01d8d5a8d9e651b8e174c87469507b803a3a42cf5963740f5ebc44e361608ab4,150, +211474fe26369d91b3dd47c0db4edd925e8168fadc38c99499a28bb86c36c1532d46ec038e930da9de089acd7e81da6029135fbb5f6741cb08ed31281a4299b70590f566f829fe182c2e8a7ecffd4543b0a26cf1220e224de9bf3c6aec22e5f60b454682b6853c823f9c9e8f0c40bb2f9e2fa6320c9eb6e466c64a288c84d01b,228ecd6e91fc95a3d87f152712d40f643ecfdf30cb1337719eadaddd9070f78e1d6e8f859f77bd381b3dcf1e9fdf5e19b3cd1aa45b69931450d4ea7bdd086356,150, +103901b0f3eaa6e7c7ff5895eebefa8baf7d1c91488c02d998f57e69250269252541dfa6dcab7a18fdf0d70cee24756ae1f291319546b1acbee56c1b30bd6cc81017fb5afea37f8191063de3631311285a40bfde9444b85e4e7b54b0f64c4d7d2172748f5b1b249b73e3d121fae2d9c63c4ea05d774fbccac410f7eadd900993,1f2b8aa2fffb1deff5a5c39ffa5e83a72e0748ba63dc3bdaa63cbaeb32e0fdae1e76fe56f3f53303c0ee624a3748d3457efbffb7078b77e17fe117db4589a484,150, +24855abe5352c7bb687d1c18c0458ad00d7a5b33ab6523ccf052d451dc7f4644265d9491f4fc7b6514639c0d36aee4f8dc1e5ebf6432ecfe0d579ca95c9dbf0f2d054a6c66573280065904352f8e069da63e6b57275111a337b761349ec540ba18e1dec4945ec727248f117facfaeced0bfd6ec35dde26264c15b78cbdae4cdd,1d8d1025e7568d048b0b859e6fb72219137623e75139e6571f6f82d94801d9a419420178e8c28dae0a1d67af7540e4827542348c8e78c17f3e877c126dbbf33c,150, +17237ad1e12247cdf6c467534ad830bfed010b908a99570b3c8bdecae041aa9505e26300539ae09a002025d9006bbc624c53a6431d4e3f3595b12c5baf9a6cb70c76ecf14339cb9c916ec45533d55974809ad4af38c7004df3eed5716612e5ee2f3a192124f2235071b92abae32899c10f9b07ff751072dc066b36e50edfd350,0c7a2d87ba44c92ceabe01764acd1b4eb1b4c2794790bb2651ff626f0486941c040714d83bb7e6f1c7b439707f9472e002a5b0a2aebdd1c5678b14f98fd7390e,150, +255810ea6036c9ddad5698a9523336ac8714a5f444e2271426ac69b4abe80abc1e2ab26ee21073b9c5960a3b77e3fcc3fb6732880c5297e0e9ac36d8bdbdf5ed1297be97e34696ef4da66dcf244a2013dc7e5c0abfe8311d306d62e2602e91570498361caa564b0eb20d629b915a29ed03674cecf3d598f63ed02a9c5310057e,0ec30fc7ce6d9e1cb7fe6b090fa3707a01bee435964bbbe0f1759384c05984882714c7614fe43b85aa6db3c22acd419519d2e227223d083237a6e1f7781702c3,150, +2ef48eec0ff0ccf97f23d50712ab72d464ca2e4bb71d9f75ee3b6ebe097659070bc608127319f40696dd7463c79e4323399572bbf5cac20027e59fb557a268a528202e20f52935ee4dca700e282bdc3621a67bd69f6b5a90efba2f154ca186d4147a9254fd743a62a97ff625b181a3869b70f2b84b3b4eb90d060fb40feb0b00,2c24b85dd73de85949bcfd7ba383689fd75129b52a5648dc23ea284c3506395c2eee70462284998b50d492ccbbd596cb8e71026fa3fdc76e6112dd929ac75ee6,150, +2bae70cedc7125f10c969debcd0b1fb69f99f24064c7a41e7e666c7777c8f5342c796456b474f0efad2ce71863cac4e4a037585e724ca6eeb0dfa3351e69e40d259fb767ec00aaf0b9719dae928671da277c69e98f57b77441d23d6433677ab82fcabd9feb7ca41d4c2bcf780da30d43483cfbf1d5e05fcfbf0c983c85cf49dd,0094631c3a3e795f30ba329e9c83575b1419e52c0d28ad8b7bcc43c50d8557da18b2202d2ec3e7d30156b537c1048be35f2b6b8d59270f48de1240d6d383f1ad,150, +182751f98be71b721c41bf0a883194bbf92d5193872d0d7e35baf51f2a8e2f2504ad81a0dffb6f81fc1ed588379e1460bebe968e84913e3cb7101c7057618d8b16a911b9ce8638c266b34b08062d8981840fd230d4d7c9773ce21e09d3d3c0211ffe51165e29a851861f5f2f7e8468b4dc586afdeb2726244ad91987955d6983,1951dda5cdb7d661a2b8d70323e24ab8819203eea8a437c6f06bcc7205bbe7051bef86f382f8f29a7e3c3b832deb6319c9ea609602577035b19d5efba088939d,150, +1227ece3fe1b844cf18eff533b8b23f03074ab7390d2889f7ccf423cb01e11430556555f5e755c263be28f02a09516940938e35965c1b05b119908f5a4851cbc15971afc7e4227821d6818b1679dfd285fe6d2baebc7253ff63b687fc04a1a6720d71e592c1230c9c54e16a9ea5b493aabd28e89754c639a9a1336680dd1b527,09834a8928469b884e8386b57ef9499c88878538b7a17f4834eaf0d8200e8f71019de7baadb02ec2a69e6fe6628f34cc61b6d1fa439db61f6c0558de6473b5dc,150, +2c6afbc631fdd9490ff39c0743e9c0dd9d4ee07d74ad08d37f1c1bd7b1bf5ce60cfe5e145970583d4607b06a6a94e5caf269b5948e3dd001bc5dcd8de78aba892479e0a09a9922449cc71de5aeee3f6a03ccdd310f276e5100cdf9a408e232c70eb708a95d71192040e24a928dc3c05304dfee28458909ab4a4952ce86dfb724,2208bd94ba6b153a05246f311b524020809856c0d735b1ed935233d143e2c45902ff0c1d342f599cd5e517de82a8bac118744106b6e68b2497fdd9c3623de0b4,150, +0cf03bb8cb5d6f4a35512ff27c84d6fe04c770cc7fd02eccfcd1283b6febf32a0aebe793e50041cdf7d5679c9077d4d12e0244c6ad6b942a05f3da6f47be68690de51f63da0eaa5457cb6cd683b24614c719524c6ae9995899d47f5666280c0d1722ea4bc2813b9ce95bccfa3fcc31c2eda811395918183e7e772e934ff0c541,1a29123b6904bac951fe2b1ba74d7702240f33210f6fbc5e5ee5c3ac0cceed2e2350f673dc48756f5dc581546b938618af6722501018ce013c269fdc7b6ff955,150, +0214b1f179b6d6274af19225258f1b7801f4278abc164178ff1d1886b5c04e56129cf54421360bbcc261c0827f965063d72eadc9fc38836ac35ab73c2bf8db6702862a28d0c17f613dc9598b9cf8307d9e18ce1fce4c416b7b2db3d93caf262b1723259cf3837f73726a36b08862f8be76f8cd4d57102856b7c036342cdc47ce,1f13a67f9630c5806e9ebd06ea356ef0bbff1fa7a2b3bba689e3c2fda4b33e6a20ce27bbae055fdd74152f3c4f87ce555ffed562da5069cf6bde7b05506e47b0,150, +19d0f21b49dc3c6e554347358313a9b7fe1a41c4191cc16c91af95ef5a64c4d4020ebecc10cd0cb9c3f2700c7eeec0c6a94335ff14db9884cb4d619f18e4d711072ce97a3fc4d1ba514293615cc8a2c0132abe625ad4f6c49f7f47817a5bbaec0e6db0bb61e523d89297f7816fab289cbcd6b26bdd88706eb8d916246fd1f502,17adb8579fc6dba94d69520b192cc6d9075b2db57a343b495afd35568c2afe952fb91fe72b7af9e1419a2302114307130d465cd3572cb7c878dc0e2f2302f90e,150, +0e89afb1fbcd6656bb9917a22cf1849e718031644373e8cc76be353f950f13321ecc4185587abf9c6195d3f074e2eff7baab33dc81692df74d7143a5cd089c5f1af78ba1e75727b12442cc4fa9c5ce425c3b0ae5bd9d8ebb3b394042953a466808b7f5c217f124493554a4bfa94a6ef0b5cb361a9b7a3ae5c1841ff40f69b9b3,01a2179d446fa0f9c5af8148d4a3b8b2c85c72640c6dae838400489f14f3c9e20139caf06472c9855c922cdc48d9e8850bedaddba6c84db2d615a98e031b5ef3,150, +103e8be28d1e1f83e1d5a047c45de5967102316d75d1c7df2b046a5e35e477f91f52e5e5d7616393e685694d5d264fccba6642624d6767041b9516e4c1f41cd9180718a488a22928b1c6eef3738cf1c5d744b485f982a8f68f29e9040a67671917aab20e546fdadd0ca5def472d0649ab18d56c5401aa0005fb1700e437d39f4,30060738f5fab4594f6d1dc6aac439897c8350ad6cfcc9de0d2c6ab5cee427cd2daf3650dd4d025266de83a28001bea9c2186ded39ae8c0786c36d75ef67aeee,150, +1cca7c814f5227160f9a6247ca2d54bf093c7ed6c5fb80a2edd885d33afe94362e846389ac9b5bb3fb22e6c295104c383c81fceb835a416de99cbbb5b9998c34244a613f693775fff921d62a6b32294a1d88dedce24853bfe6797065a60a14d316f51df0c1e5617982971bb630d91999865e6693261b5ca30db8d542a0ed6d05,07d23155742b68fd1e1bbf3887bcf9e89f8244f4a78ca73a59e211a959aab8d52e7a85416c99b2e818796eef882aead3d74ddee452c41615358c515158ca90e7,150, +2c3abc7a59125cc6daf4b2465c5b33be0efd3b067d42c4417e8ac39a7092435128d49fc1813472e332ca50ec977eb30d890b7a10838a5b25b6faab18f3a8405f1b74b3b56da96442119cc98e9af8c8d4eeaff9e72b8346b1ed928bd5985e9f1c119c0894902112e505a7a1be66e7d1e64c42a7ac07b5b44ea7e00b488cdb7f51,21aab05d4e1528982d2d438dee852d85abb43553d62b540a8c5da9040e46733213314e3abe185048936e9df50365a9a6a4049c4b1a70947ec7255f19def29d65,150, +1482d61e71992782c3861873b121b14f5ae44c9e918a2ae7ff4a50f6c637edfc137e0336983fed007eb490c339e32fe713c6cc21be0183f14171e44966ec85f20893391b426e4c59cd506241793421e09e9a30e8e1fad3e62afd5f1cb96b05bf211e005c271d07f61518ce5b796cd4017ad5825082903bd6e6aca8ccf46f172f,199e652322919622366a0c90964af6ddd8c1bdeac68a9f80eabfc6a706e9dbc929bfa8d8651ae3caa45a94d35a327032746bc447a62ef0202618982599d7d560,150, +10f92d79ea6749126d6114d04937d0ea3089bb41da9749a11fb52c6d3649e50f26ced4fb6dd40d85a50ffe2e7cf1c08a8dda3555131ccc46bc03a8606e3d2f5424864bf74f24691099b0a3b205977e23f771d26b6d3f43eaf75d2d5bc02517b62091f460e18acc8659e73e604fdf636e52d9ab1424788c319b30423b24e6f51a,121502554c471ee2ba9450c736db85b820bb2552864d8501109585e9091bc68b0697149f0dc47a2736c96fe19c8b9984f896818009efed8f56665cf34f2434fd,150, +1ed3260adc37c035177ad3c990a3cdd2518803344a6b87b7125ded17571cb17e0f8133f2399127b41d6c84e136d5fb001f96ffd6179462cefc0093b7aa91de3f21b8e78b3a615f9aa70e736cdd3324ba7d0ffff59dfca3017f7c5eb03fe828640482e791cb8e39e48f71de551a423b5fa5a8dcdc13f55727e7350477c5536528,0bd790ef8fb3add4640a67f442a2da8b4d0212161c531bffee923f99265feadf0bf3b061ef9207c52ece38d2eed77dd31d6dfd7f723f003e46616ff6c070b41c,150, +264a97b719c9388318ce5b09ee0422b308947de8db4479949dc7a5075a3c3644023bb6d100016e414e27d120557dbbf48d22d9a55b9ffcaa5275c5cfe071e53f080c2b59623908c80a6a4e71745dec2648596e3dca443b409afd3de685a08c97255bf0532e48de8b49611bd375afb044e480600cabb3a0008296c87135bb58b0,2cb03487dd3ca9fa89ad58f45d811584e06d576f9368e7a24a46e473ecf066cd25d223ec005c5fac7e65634bc8fcf5bb57db0f31f1ebd0264c0419ab70a39c13,150, +0ab0de264bac527bf2eac3ee18d8ef533c93d23ea37cd61a92cabdafd70959b41789a726d0995e4097d3be2cb398163c4161a8e895f48c4aad7b9b1276115a042d03d06f85b22a4291c315d83623d7373e4e3e714de7f1ee93043bc0e8bd70332648682cf39ff9ae4840891ce7f19ed8ae617664bc1dbb4118f6fee0cc82fe42,0f916e413444aab701851c4ee37bd7d95d4cc5dd3d6d50e915cd2dd29338409e23f5ac64bbcf41f25f8c5055864557ce6e04dca0384cda5094f7e2ac90525ddf,150, +035feaef95fad68c40dbca4b08d2433842c60e11bd0a6f397d1c923d9476ff68068512569a24fb5e3fbf52108a20a1d98d43f1e3d9158c0d835ec450b121833728f18dbbd0891b634bbe4006b8d9912fe7ae0b118204c873bab1bcddbbe74ee72ca4d97b0e66cb976850d115b5d98f77ffa210008744ce4d2afb45d40f444389,27818fb5c8a4607a65cf69878744da80e322f5a9861190563f3a583109cec6e711ea9f0b30de3d89f3489af3c34b2173f64ca3a7b93a9dcb32ad8ece2b33bffa,150, +1ea9c4ba8550bf97abb5d3e52af96559f4fc88b1573daa82afb4469986d7faa725896cd02c0a63e30d783df783827937b9e6c9ddae8973fc5a2e7418c407d95d1cddf82b578fa6697d183f584f855ecdb50904a6bb2f912b8b81c4f67a02713d0d978a6048c6e9d9125d2fa087d2ce9a3906a1e7461737d222674014c203968a,21aef85db2f972b9ad11a38241361268d9e4dbce08a8074d382f1eaab8146e050b704da6a247b0c211ee89b1fc51374f9cb8a8b50c8233c90944d040a84e42d4,150, +05b951011e230c53446dce9d88c0cc74a50cc63b84c287f260b87275122801260025dd08bbef879ae8c433b99c46c7fe82829a65c4ad3271ab023fd2f6e14d1b12e6f85738a863acbb46b3ec682daf47b906f4030231b287ea53322d3a13986c124378eb76ee653d5b789b19ea4b4f03c8cb9dd71ab42ea879208360639a7bd2,2a8f9e126644c4a6eabfa7fd46a51a2058e34b3cd63a8ee162df99fcd0558a0615587c2e8df061ef3ebbed461e13b3dffca3f1124b431a2622f3c5349d4facff,150, +298c7d63ccb2d9556487e70e4a5add3e2d9d79e15a96127f10c9555351d18db21a5469ec28d5c3bb2791de1ba931ed9027296ac6a3f258a5695e90db201ffaf1074adf2edc953e019f9c5ea180d0732f19d41fd1e183d6a7ad075bac742a2fad247302fc779b392cc025db04aa679f7ccbdaac7c243b5a2ab9068dc6efd5530f,0accd810b4cef9eeae32fffcdddac2cc1ef724f4708c8a52a96a66e0e24717c12f1fa09657b57691b7a7661218f62d6a87ddda38fba927cfd4b08d4f4ea4c338,150, +1fada8ed0db71d720f8d440021b00409ab8c28ab35d4d8b6777cd3b6c91f5dc122a60704d6578a116e484e9eb7f5ab137f60ef39b2da4c6164d0ca5233e312801177b6c887c26eaa663818f6b0126ac6e0a9d8f8c77a0ef47e43076524a5263b1630ba99f417e03b9c5af536b62ce6603dd0c6c23027c8d78a600db2ff13a236,27fed40285bd21fe20dfdd1903a42c98ff6a282da7b261017a98e55cc2f7e704055ba2773b68c86b9b15fa6d7e3edc19ab5aaf98045485790b0f446e31e28691,150, +1d2068ab25715682168446a533698e6a7c77ef5cebcf117ac4d0d941ec2d795f24d3d9e59774c71fa28975ca3f8e9bf80ac5746d9fe0ced96cc1719e38f8cb2d06caedb7f88d2d8478c74fd92be31c0bd60a50bb5d3405e613521b06cf65d50d1c114379eaef11811f29ccedf5cb12741d09d0fbec4c37af05493c738f7b2dde,1c0a1c908850d57848057fd4663ea635235cf050a9549d02b1f8d9b258d7e2e712014a4a7368a05615870d59596857a51f7c4fa0758ce63664039586f08551a0,150, +0c4c1e5a19124f39294edbb8c3152ec225f91fc53654c1c75d5f6c4b449b3f97154b814d0859b8a2c23fa81237ba2040d99a1173e71958554746ac066e0b9d410ecae6ff405acc92769d2262aa2fdae567d6c3c17920de1c6602e367ad6796e504354bcd1e24d2f39dd55b12bc7f2f569ce87594e293d46b39640710f22c174d,06e7b7eef8b10b3fcd04f91e16f4ae709ca95f8273cd649d534c16415b60c53b1cffd2c358880a6dd7dbe3f633369d7ca94a1ef3f07f24c2dbd1624706e6266b,150, +10211af71ac208d9de4fb625b3707d27ce6bed88b53d4fdb8c8826b1cd5771fe16e1600c01e63ddac3a858630946d23968fca2a3651e5c285be6b82e342fc9650e10f00da3a6d0e209d6e21d5fabb0b9c87d8c3d207492f74ab7f2d94158f70d12ce0ec93d792cb207d8de64583c524aa65d481e1bb9d94e50e44ce54b9c4b9d,0a96c6f9ca9da7c7e4b28a919499bf3333713a23fae4e8c83e9e8aa4c793f9561a4dec95a0b219553ca703723eb2e2af148747fdc54bb3cbd1d6d68154542afe,150, +1e2c6916c05033640e0f2cbc3f68b1e1c6830704aa8dab8d9b156a868688228900ad36d5d55cf340618a7c5f5315f03a26871aa4099253de18484fdcd540466006e4b178da951dfd93e55f7ee230461888b29903e9a6872d0f16e1cd9fc6af8728e6968e15809b596e9523e2994b88301afe6fb84676223f3b2f675ba12605b2,300ac6f22d758db37a7b96d071cc462e3f3482d98e4a5cd8840b9f0525e5a85e1d7e0cc9ad91e10884c09834a2b9c85149a6c4dd84a128f693546196876c330e,150, +1009c4a75d1ef3260717517b976bff029fa3e3dfebc839065e06801b883782cc07d3a288066725c4a2492604dcc7f63cbd6d321b694869e94abb938798c63c6615c3324e5c7d68efd3e32aa1e6b196595c0e83f4b1d4783de2e69a3e15b1657e285655fdb350ff354b781dc46c5c1260a811d73fc50020aed1171e53bed8be11,26d164e3feb91798c606ccb5b02e1163ae48fa2310b753888d48fe8edd13fa5f1810a1a5804a80a53035c9912c6442db5b93bf64c013ec82bef27e1d79cfba99,150, +291ec0caf8723c0ad714ce5ad3ad5c78fa26dcd0409e36303dda1fc50e1addc818b320b7555b51470cb5874f404439ec6463f3dd4530bd114fc089bac58c046526f36521c67d37204e69890294adcd4228ef33ca5bb129fd8383678369d12b3a2025e9b56ea6c6cfcef2744dd037439ed78ae83bf0399dd77580bdb626a06077,2293461f7299ebf445602f0ae1629b7003743c499d9b89c857c11952861f341c06ce5d8a0ae88ea2c07b8f46407cb900d94aa7900229b49918f42b554a894be7,150, +28392e942c922c4db24aca519c22a391be2cbb02871244f188cc7837250216cf23926ac571e4bd287ba4778581ef4bde05dd9b1c43822188f030b974dcf8e6710b0bc091a9bdb0fc304ce3d60cd27d2a361c628549e3a8f97bf0acf20625d35c11c3b91f52c5540ed78f7db48e59ccbbca3ce99c66f4266ab651f23054a4e661,28c029b5a2ec9c284e80cd60832e4a9283a35f0c878d93a538e032f073968bc0296c7e3191bff1790d7c4994bc90323687d181f442a2a972d6a8af4d00519cbf,150, +2f78489ba709e620bbe5ccc36e102fa0effa9f6eea328cd434f48b0a9c68e5be0a6c738f30d57f9bd8a009ccd96e3755285bc097305343fcae4fda0276a4af7f0d12817d941b86dd75d01d39ba84e526c456eb3ad58f43cf2f1664045be3a48710f776c640028a9a602b5fe1edfaa722d7ad3208770b7221a317a1cdb8450453,0eed32c9711bdb1e80c6d79fb72b05c01a49acadb4c9d8ed2c40b71ad535aff923b7c36b8a2c06014fe05b2b68b83cabbd1fc73cb043915e29c3d82c205a473a,150, +114862f7479b1c61f546c10c71f66d65621de2bd848902092bfbb12cf91c4b270febd91a7a916bc321216ccb4be132ab8822f9e833561ecfa93c9b7fdd43c5b01c147bd99f33ebbddbc3f97064baf24a8fe5a598277003c72911b5aba02f928e05c4053fdba62c9fb31e14ad6b79d1f0e82ec9b8c6efcc9bef2f358e83eccdca,0cdaee35b9fcb8ce6c61f386c7912977928986437e417f0f6ef236723a63044f29bb12baf8e418f2545917a37821d29427306eae3cd573981aa264a298e0bd82,150, +05071288ca5457e4e4e1d7be1bd70f1a6b066a2f214cad32eeb4767ce93e5ca22734d59ca7831623a582eec6dcef4cf8f4615552708f099243b69a9ba02ea2c70142045affa2db88be640c3f8ad55300603a103b07204a9504ed10d8829dbe1906583d821382bea1a1c229dc20d0627f626284328b77102f15be11ff71fa0079,184012a4b8f9fa8000ae47434d0a3f86c35f619655942aace78f0d8ec27cc6802bdaf84313866ef2c5821c9aa56d2d1b92e0eacbe7c1abee12bac9abf4f13641,150, +0554ee65f0b2ed3e2878ee0b69411460753e62bcecc160b57c42d1e265827a8f0d25545bf1226a434235e67e9d5e9fd33b90db3f731a063f9d901243db5ab94224288d8445cd4dd1fc205cb60428f2d779e850f1d1185273c358f1ff9ac6ae110168f351ffc489c9e9d77ed5af3543db3b4221e547ecff8fba1936738e0e64ab,1a6dfc8b51b3c163fe696a2c02bf215f3795dbadc0698bfd881673bdae0f89a00c4c33e233ff070be83b4041bfc77f6b71872d3dca902eca69586fb6ae98a2ed,150, +0e1b614b9cb840b73dac5b9fe4ea6b9fbc6109887847e5444f3581ebf791302e26a7d950c15b3a6993c948a768e4a90f6aa3e0a5aae0065dee9dcf5e5be7cebb2c599f61c1be1e3a2f96779928e9b829cf1bd84f78f1b45bfc35f0b50aab68bc070d43a00461541c69fb80a740192e0a8753f30c96332dfff6a4f821c101573c,07cc56b65eafeb53706729b4933019db4526d1b033dfb18f1bdd9d02f7feeb080a82f40f343ac4ed3b09eab50466ce16f433ba21d109ec77f425cc9ff5e7419d,150, +2fdf2f3ba828a7397d40a832b502c095d9d489dfe31cec6db357fdbb699b64c41a929a1f0630d22bf301804a245df160cf68d290b39b8e933ba05c8fc218ed5d02a9cb7b86fedde5b6e4e70d6594ed6cc4e93f9cbd264f4ba4d65c9568d000e410f1f8c8ea49022b454d590d71d10a33115eaa0196f5f2c544716fda9ccf9ef2,21d660b580295cb29e87a9d64b437324d1b43166abc51d2baf0bf9fa17d08386242436be9a7db34d94a71644767a05784092dd60f86feadfdf1a2031f20110f7,150, +2d4083fda04d34aa73cf8f2e656eef76fa40adaa33e8927be59d104a0b87ddea1cc4db42c9d4ac17f85319a7644a935ec9d0664d287baaeccc5ce69316186baf0f6b637e7497d53c5ef9a8d57752c4fe7f3d3c69158f971d21bde7a62be5999f1b9a6ac91fa767ebf8fc564298407b7b76b8870c2130b63f17413dc1f7fae0e5,2e62b426f170766387f0674365210ea7e482cb0b537f971834eda546b73f92740fc29d55f559e20d232fc330cf96c8829e4a3b41db017219866555f947dbb8f2,150, +1a9099dfe1e0a92844205717b0d35a3d3768d06a470deecd98e61b36f7e259571249683a417d71eccc2470e50a69f01e233277f0f52a6c537b5601671a96cf3e19f30465c47205e765299266b34effbf4842426b309d1092a326a4ae48889c1f303571c33a73e17c4cde925922725758684aacf0961cef9966725d7e008b837a,11c3566238727a6b666d1517b149218857756727ba16704c8c627213f42266090b0fbd126fbcc45be5224413afe91c2160f2049beb4f7688510279bd7fd36b45,150, +12c07012d5ab1097bd05b53bc603607b63b28d83ff4aa96eed456dec24777a8a0dab10bd939903f23d87575b55133c6015a06f7038155115de0d1867c615673100aeded4f17200c818301aae5e7330c7dcc19d314f6e6794056fb0d8881907ae22c9b1d632e52cf6e655110d4b774c032e221894a5398c1875aea8e9c29c6032,130fd339c768b146edabbaa5e6537e1b8a0364534ecdd5e2fe555c66a1cb2b8b2866c08aa58c038706c813ad1c40cc323e7d57cbd0ec11566788b46c1ddddcad,150, +2e80ba321211f46adb74e026c16084d29c3380062c4d24c42465dcc33faa13bb2f08502f46acfa9ed9f06860bd3752432ae085cf2b65d4b5168e6b46bca5b77d0084bf4c327e0207e78ce27c8100bfab04480aaac171f49842a5de2b5a6cf1952029b949a043bb68704cbd9525d60564e8722d9aecf310b849ecd4b554ef4a0d,04fe07efbd83be3ae7d5c294c079a5d3db8f11cf48da3deaef453312d50dbf8a02841befba7d6d5d8ad519f6158f41825852ca49145e564559199888eb9a88d3,150, +229586fe655b7249a85cd7075ae9318e439e4f61d23ea5e8c156a5a3511810141a65500ec8eb618efe54b755fbf4094117ca086e86fd26eebc96aa8d6816a6aa1687bbd8c5950ff6260e79b41c1bafe387845e77f165477d4d632fd006e3d88313010ead0d7ed3dff806e4d2eacc4912793e3bf6261db552111af976d7eb85fd,2e6397fe62ccd0f58f5c89cbcd33830bb4a97c338dee273bf169825330252ff118223b9f3e61b9379837bdd91d02e035e6658d8b21a2910c1ad3aa1a5bc189f0,150, +136a0c3855a3712289bd8d288f1e41ea71b81540e48886b8ae659652aa85d6ed07d6cd0b583addf694636fe79933ff535ba88f78e3033fb69603c9aad045143c00048ab38ad574910aac605511e44a4c6a57e1d46a6af67df37fcb72544b7063053d07f4609c5bb9f623f9a045f7f8c66b309c38e56e44223af20be3c14cc914,2b130d7e6d8f653841f62bfb25b0f6d85f6067b92d40a2d6dca1c9573578310f0b43885d00561bc692ff7b11c517025caf5a255e6b788041b237ef4bd5b4a36d,150, +278a9c89c06223b43980109cb831465d6b01cecbed40f0ae204e35d884298b5a0f45e51ad5dd04b3ccc4ae7bfff6a8b130a598e043ecb7f6043dbaa3db7333220eb4e15567192a06f00a92366f6c33361d838e71703e3dfa4462ad57ae02c55e087b70c268e9bd99881ac29915a0a005cd6fdd86defa4c8deb119cfc0c80bc37,03dfef6b86eff665be955cb35a53a828dabbae009f98c992503c58b0177f98301aa4633364643a5d1a2a85cf8dc352babf9c0d79d19e931161be8e9a2b001264,150, +16e3a81d0d7756cd77abc3a996c6e89d549e682e8eabd751656389f1d63565801ac35216b24cd8f0fec294262338ce95fb02806d2601e3d7eec815f5ddae893713c13a9be4c2d739a5d79741da16b9b6b8ef68a60818be222fb900eba69297a6101c7f84259249808fe5bc344e633857ba7cda72d9ca1f058b7dd19f374c4378,19f8dceded3fea6a57e6da75fe7fbde2f01a75e6e5dbafe78050af0026335e6c124c231265dffee866df46a8289bd468f41f2396c4b0008355c744e9820ec5c8,150, +302eda30769a54ff3918c691d85dd423f23fe16e07efbaa98bf8d29fddf263f1026d8718bc01c62c74160d7b818b20a384c1bafd083f6302730737befd81d81c129ef0baf2c07402c349ddfdc9abf7faecbf81a5d0ebb9d12e0c0ec2d5fd7aa305c976fe4006ff85d70e749c952f081b5128774f9e39176aa65acee154cf0ab2,1386c4d0ce195034e1667bb69de7d64b6d31a1ce59ebdfd791606b11ec083a7a02bfb191700050778c448261f0552788f1f321778acc7fbb08cd3e12a1a3e507,150, +21745cd3e48a6e9a253a4cbc0e5859e0328254a1c9f6747047011ed2bcb481151b8f8729984498a32031d2574a82cc7c8344de92ce86d3c2b585584d110228932a681181d885eaf71df10831a33073e9fa264a880e34087cdad076256d7879942e5ec5872adef3582f1c1fd8321b9fee7c3f509b67517a1556829dffd30f98a1,2fd9c911fc460b63f5e265bec2241f2fbbe70622d78f329bfcc49955a809c6e9013411a24c32295eba6a112d0f0c0525d6a6bd1b7c79c86df1421fd0a6346b21,150, +1df0653bcdca446dd20975db8c8595e849322e00e075c12490346555ffdb73d126b9776c77850338771d643c2eedd5e96f00744e2b9cce42f765a4b3fc5545d12186839e21eac05f4f63b2b87addf55f390989ff2eed52f87cde8db39a1d54e72e4a528c156023f9bee59d36c9c19204ee4d35fa48e800aada89b7837dc52a37,22c068dc655b88d304c46632e0bc7897cb19013942b641c743c67468574589452f0d68c00d310178303a36be142d9b986e115b6833229b1f59c4e0345c31d685,150, +23f3c291eef3693a06ecb43b56910bd97ce11cef7e3b48378318c72ea0aa2acd1f905276f1d1d3614041cb4b6486bf4a7748cd791c19f53cf928db119ea6c55325fe3cfb7a2589c8487f16e7c73c58a00e991c22780130c1d6b5bd05e65db4370b4bfb8bc7a267969150b99eb2f7ebdf9a1f08644f787dc07cf8847537e3c56c,2c4e77d687eae1080859f1bd09387655570a321c2eb81550ae0861086a5a4f35164f0d42d921d9a79b166719b5ac9ba797886fa4a7e7761bdc8e18e3946894c0,150, +2cbf2ecbd8200bd5f4c9a6c1fa6a6073fda67eba1e11de447116b690de66eb0f096209fb690d33cea94d1e84562ad63b9c7dc5bba6f71601007c7758f539b2a6142ba13ad5fab9081b866f4268fd90c3580fe02b0e4fc099350abcb69216058f0aaa22bfdb62b1d2bd7d148f26f1f63e923c5d454cfbf84a2552981c70800a3b,10812d90dcd10822e5cabc2a9f2e6cb8da10d40abe0305d50c7f0fae2cfb1197206eaa7928593d3f835406cf8e0c2a9812899e1cce2fc4e9bdc61f9ee52b55e4,150, +1c8ac0b983a1f847cfff90e5452e07c4de7a1c99f2b0f5ed974d8dd30da7b2c9007a0946cdf94a4d82f5f44071b229584f8e5125820bd1190ffbe7278ff10ce41b68edee5e4585b386fddf49b80955c0655a7aad13406e667189fce7a618605c11ba1e1fd1ba2461fda37d348c104c1ee89339a08af8187d783147dd5376ce12,203d5dec404099608f61bfe2bc8435feeebccb13daa4269644d4171a8891fcd4074f16fa14340d310f85f248b634deba7357dba4cc7564ba1fe7d5101efbd426,150, +1232fd721a04ff9e10ad2ebff59f80cd9c303e7ded18903cde6e3964f6ecc20a1f2254ff4ab978acc414e15357ce01be85c06c54e4b6696a81a8e4f63bae17c829c8e8c7a3b5b37d6458ce6d9dce9a32dbda6eeb175eb9887cdee4f0f1feeb4a12c00d5948785c84455086e12f1d1987cb687910eb7a8b8a1b5d7215c1da8f55,15fa8715da6000bcb52628407fc6ef198028f30c09db6f8fde343c1f205216f8112fb8984176d43aa9391a444ce3fa9e9b808b2d326521e45878f414311c050b,150, +0f26eb60722df0034c23d24a637e3d5dbf0a19c2b2e871e57459e110b72ca6632320513ed4933eb26c82c70c47b1947ae2da385231fb3fcf6a5eaf78e0cbd7450fdd17e51984a9876122a5b183406bb0501efab1802011ec367a7fb82612a9f11022ef8aad7e9a1060f9096ab9b91cba004dde9ed1ced2b2afb6f416d59902c0,1afe6369fb77bcd741c77c140bf141b4f53142537db0bfc27ba5ebc97c68d47e06f2b468a4fe302e6ec2166ff6e9a5aaab89d92fdbed0dc0655cbcc4a6f551bb,150, +1ffe6c4643b67079caaaa9bc9488b91cf386e00ba44781384b64ef38a5c80326123b425a01473f24111f23f887ffdd816b0f2890fc21101dafa89baf3c88e57f060ea176f5b32ef3546f2942489f3ca50b51b49494a48cb3772f2b286412b5e42ae5ae3b2de2546228c0de27ecfa0432e88a108d98163ce433077548a9f93f08,01a0f938596737ccabe32af9fb6d01c8210fce791190b7d9185e980bc806246e04885a09d989834e3ca4ef6758c89bfc977c2a5a7ccd62f922e41e52825ed7f1,150, +1e072442d63bc81eeda09f7cbdafa31b8871f936adf61e7bf5ed83ee5274a6081b179a24db848aeb4f7472724dce78b5148d243b220330243d996058c743eb62271adee1d2c43e7a71519f786dc94a7a1ee626c51b097af643ad1181c748dbcd2a984ab2002ffe2c3e2c91122bff3472e560d90fb7c461b7cea6aad9222d2a61,295da8edb64718c278bd758718820b765a397ad866e09adcbcfca2acdd522af513c971665f24e0af820c5b6600a2abf1c45c6cd473b6947cad813547ca4db77e,150, +24467f5e8ffbf1aeaa6aff6e8c42dcc9f1c15a5e3d3e4abc066b9dd7d3861fdd0f627e79d04d902e2a62fc06c82828e0a0ebfda78ce0ce02f687ca131ade24821b22fc3cece8e9dedfa909fa4f4a09f8ab7d230f959a0997a7929a974ebc9a3a2863c58f66a4334e50027fe8938cf917743e01c504253a2c3f0ba1fc826ac840,0a4b4981692d1c4847ee9ff270148418c7100f483123b37987b94bbd5bc74a76145c904c5a6737ccfe5bd3b150864222618d219b781c37354080aee89a03969f,150, +08ee94e10db30c0cd5e52708892dccffd11c2ffda5640034887bb815ef8170740160071faf3f4186a57b07526cc81fb6680ba41ba72b10250b49a84ec5bdf00e06014601f1c7f5068acd096b5e3b95bc5a083963eb3ceed449d8ad8a4534de77107b6375218f3394739b1d5fc70c91e062bb81878f4edcc95051cc42c3edf8c9,1c7141eda2154c43f9154fce0ffcca086b00f223aa4b8b7c4dff3a6dbb90fb330d9ec7fac9cccbd16b0e33af39a9b40d4466e463081ba0e8de23faf7150fed8e,150, +061504ff5b8a28489dd7c4e2d8cd399f14ca48486938e11834e2dd90f16ce11f04b0e823e4c1ecbad1f109f45f93d6acfdb44c0f02b78197243cdd9211ee08120aebe1bc51afd1019928419e473710752d2c69f8915afd68c7c4a984bdc7af7b2335b84ba4e92f8e82ee2412be02c6bee09861a3d9d418edef63e462290e4059,12d63f9072e057e844b3dfb280e7b61971f26195c16aa53cd85dee9d3fb7e34b0937cd4e8578a26c52ef9fce4c6ddc459931462a8a7a24532456a2e4c8071464,150, +17fa4704e7748b5c140ab1ef4b6922a9744a3656f7fd6abf2c52d9a71ad22c0324cd36a69142d92c1ec6d3bd866fecc0562ec53e304fa0077f0c5e44b59a9bc81a2e9beca11e8acb8a081cb32ece8a00a77ac6d55a7dda49cdbdbe1e39c056b50e65a48bc0dd48e2340650529da1d375fffa9eca88510039ae55f3c446c52d14,1e4b0c00ae49c69157f85536254bb94f01b962de6bcd77aad27649ce395e55c814bbcffe3146e0eda9749da63e3766b52bb71b048126a77b0bd90d6a9552bf4f,150, +20e4a3f4ca1f3b90d5fd514b06340ebe74e613e463faf273486cb38b80bc1a9b009ceb114675902e73ed5ad36a83b5f8db5d1073e0f46fcb82a3c26dd1549f01211d79879817777d777a1e13157fffad6a2634826d7ae774bd72a79c0bccba611e8e565f93b8830d89ff88a0d51752fe87d1237c2665e2c79a95c66ccb9b15be,0ab66421d94363fa51fceab219185fe29b3c274f558f5099d629d4cb464bdc920951970ac0cfd95d46aa935c204a73524bf8e5a3ae7bdb7fdcab0332856e0961,150, +04c62f10ff5461abf048ec7b48ced50dac94352b51aea9df44411b7d4d36c43f0780281281bbcd5ea4b7282275262d51791fed88278521df644db200e7eacb8b19e358942199d4f420c9072daeee5d635f0dd564217cc04bb10cdf486753dec1268fe6d782cfc875645ac2f12305d2856f607189fdf20873a86dbe71a3e17240,0e63b32d1027589979faa19b4a4b1edfaae89e6d5306b64f571af80f725567152b7f394262820f54f8de02df76f114342832dd4382a906c427a8974b2d87b64d,150, +046c038b94b2ccd857aa5002f518d95512fd89813b4ddbabc934c38532bf3749294773e981a080707412a2c2efc4a21fb90572195329a5c7b223ffb3c49764a11e15f17ca33407967abaff30f3ec92b9e097fd6bf88f28a5de4a415248abfd8b18131bf79192b15c1d18ae36fe9c872b2be66df0ca8d4a11c12811df151ce9ed,2e2e8a90ed50f678fcc851e1a84340ae7bef5628e76d456c6b29c922049056e70a44ab93564ec5907368a33aa75eaf5dca74c02ec0591d5356e0ecc5317c7512,150, +0b9e7d6ea87d8f8935d3891955406ecb6a4d0d3d3ab2b23ecb63319bba7db49e1623d2ed48f405cd9d69182e58c399840885e9c4885c3e4bfd849f7514355dc90342b716288cba9a4efca8e1c301489e8ad6680757bdeadfdf2b633f1c8f7f502d5cc174ce1f78355522d96f73a69cb7d70a0d5753cc539d4d93e589aec543ae,00c13775ebedc4919ae9c37300f135e0d0450a2ea47b4a9654fecdcb9dbae2ad28f947ab1f87313ee48bc4aced54c5d6c7b868ca3a990a858d414fc8b06968b3,150, +1199b52eb2302d678fd3c7ba7b8b4d1039b1d4fc3b8044fe48b81bc2a1b173d823d7a7e2ae423fc7d23aa11f2364953926c199a3e0f0696cabbd458fab3e4a7f29986f313b7e73bd981b8bb920c35194a2603f2de0f2f8579963cca50f415c62117c37625bfe899ab68c39012e37221257087174fc6508daba8dcdf36d2a81d5,2083d99e037c02a49a09a1a05376424fb4e3d16cfb70c2149a778d42241d9d4e20d1ba2a8dd5bf347324d50c3175fc1ccb0d45aafe80cdbc3cf6f0f33c5d0c1e,150, +14fb94b44802bbd664af092eed516c83c9c360a77448827b27e05f9085ad712128a30fe917870737ce80ee968144e866ea633d826ef56a1d2e68ff4081c04924110c3925c3c4dccc1703b823dc4ccaf88bd14455a2be4dfb0d23b7722d76ff1f0a1bebfb219e890c4869d07273451338e007a795778fbc297ae4b6067299000d,24b61c093fb0080e6380f69117379feb3ecd6d5975af219d5044c652fa5fa9ae1a2213bc1a403ecf7ac833ae8db72e76ce72f7a4cacfee1d2c4efa38ae1dc6ef,150, +2fcd84e595e97fb2ff5e8f9579f0bb4c4c893f6e9c8a676ec7aa70e280ce050b1aedc3877c77ee3f42777f2dc481a0acec08b3851c53a1b33d50e15d895244dc239ca921c4b4cf494b53079c27444c0395383f7ab84d3efc8c6ddb65bd5547a2280f7c6c0a4b81b5416a6dc869ad3364015b041ca34b481868aa0a034b266dfa,13451e414f1d486f25c88424e9243012d37d8b9c0031abcc5fd4dc8b52b1385713e04a4dbcb64b055dd19e44f3e430484664e645226936481242714caab9b746,150, +1470b80a6d5de1470aeadfa0b2eb913d9286bd966aa8a99b09879f3b10c985d02432b8ccd7083d421127dac6ad90bd569e763810e32d37114a786c76458646472aa98cd23ec265f3a2aa1e68798dd15fbe0334c636aac539e1194c48e8528cdc257f25a911b81d23c6f1e5a144670892534b7369300830195c7a4cbc3bff2ef8,1639672676d9be7512362fd8099c012592e50750ac2ca669212705ca6a9b029626cfc8614e2e89fb77b294b41a55f03dd707d848b46772aa4d2556948895a93f,150, +16eea4cc6a5c21b361c4d144f81f0c5774181b19b6341ebc3317b6d9c78b493407abc49d40a88a2336ea698f6bcc5b767f290fa5255f1ea9c449237dfa75259210264114425d52ebb998a32b103fe50d3c44b156f53dd16fec92c805c51b3bc117986b497207e3198ca7beb705537ba0d6c82cb8e6e1c507e74dece3fbb17fc2,2ef81763011baa4945a15da4c312cd2c280017994fcbea76048907c58acaf8f01a66e2bd9a4c4e1ca39a7fa9ba43f615c3720ae73c0d2aa6b2cb14e5a24f233d,150, +1ca0717a8dfb9c3940a731d7c52f1699f64fe05e76189a91dc622e8fafd99de62313a1df5b32b17c21e53e2d0a1ff3eeac6ab4359a9f86e51b1c236f414d87ea0e9729271df80f9967d618c33d9e8389bd4afb88e8b1e26e20b98868406da8ce1aca0647ae2e8573e39970f442aa3900175beeef2984af814fa51cf4ab59e07c,278782b7f77402d99c21f0bb831e899431703967252026abb6a6cfefd6d368600bd99290fca19622267066ee211842111904f2ced987023a34048236be757231,150, +1ca0717a8dfb9c3940a731d7c52f1699f64fe05e76189a91dc622e8fafd99de62313a1df5b32b17c21e53e2d0a1ff3eeac6ab4359a9f86e51b1c236f414d87ea00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,1ca0717a8dfb9c3940a731d7c52f1699f64fe05e76189a91dc622e8fafd99de62313a1df5b32b17c21e53e2d0a1ff3eeac6ab4359a9f86e51b1c236f414d87ea,150, +1234,,150,invalid input parameters, invalid point encoding +0174fc233104c2ad4f56a8396b8c1b7d9c6ad10bffc70761c5e8f5280862f137029733a9f20a4cdbb7ae9c5dd1adf6ccc7fe3439d7dc71093af0656ae0ca0f290964773f12e2292f332306374f957d10,,150,invalid input parameters, invalid point encoding +0174fc233104c2ad4f56a8396b8c1b7d9c6ad10bffc70761c5e8f5280862f137029733a9f20a4cdbb7ae9c5dd1adf6ccc7fe3439d7dc71093af0656ae0ca0f290964773f12e2292f332306374f957d10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,150,invalid input parameters, point is not on curve +67376aad340c93eb0fc9bc8e040dc691bd00e426c6456b4d13079e7f1dbb3da847eb0fc271cd23da50c6ebc261928abb1af9bfcea998791e18af1817b06221e1fe708d2f4224275523fcd37460a310ce4b56f1694dfe36280410f0fb6efc5f47b85662e5b08d881242a72acbc2c8e2fa71ac593be977ad3e090c8158aace0247,,150,invalid input parameters, point not in field +,,150, +ff000000000000000000000000000000000000000000000000000000000000ff,,150,invalid input parameters, invalid point encoding +1470b80a6d5de1470aeadfa0b2eb913d9286bd966aa8a99b09879f3b10c985d02432b8ccd7083d421127dac6ad90bd569e763810e32d37114a786c7645864647,1470b80a6d5de1470aeadfa0b2eb913d9286bd966aa8a99b09879f3b10c985d02432b8ccd7083d421127dac6ad90bd569e763810e32d37114a786c7645864647,150, diff --git a/constantine/src/test/resources/eip196_g1_mul.csv b/constantine/src/test/resources/eip196_g1_mul.csv new file mode 100644 index 00000000..57bdafcd --- /dev/null +++ b/constantine/src/test/resources/eip196_g1_mul.csv @@ -0,0 +1,107 @@ +input,result,gas,notes +30005d82f093499b9fa478a525daaa1008a848343a9f7250bfbeb7ba4238522502722e6335664879c0e42d01e5512fa9ce2650059cba069f8893074beb49367a18c2d54e16d2b30e3c720090149f62cb3b46090d089237a051b85495d9a3a8ca,168f142b66703dd6b5bf32f5d10565cc930edd1bccb6d56c5589a2f2c947604e03486e8f77ed536e7be3aa3e02162950c326b5dbfc0b76a34e985971186bf86a,6000, +14018a0a0f2452f6827de4d44c7500cbe5c7484e7b412b5da1b690403a1a7646010eaf28293ad50d2e5d2d0a635fecd3e41bd7947af65adfa8aeabfe2d96bb033493427fbedcb0cef78b9c7e7f9c8cc8988165b340cec9318125be21e6ffaf2b,0a81406fb9afd2d9a8933a82841625eb73f31cd946689381dd62b7fe8200d5c822cc22a6d4051b07d07e07e7149f64644e58924d6773662c0d9d5da69923df5b,6000, +2f352c67cfcdfd90011808cd6c489ae639a224b540955a500cd02cbdcaf2a78b13387dfa1f8312ee033e220cc8bb3d3c27b19371568036d720285cba8281f320ddcae035a28efbf971ff0c230341d73ed010ecbdbb3e3b307c3a33fdca502e82,15a6be5d9677a94f384d5ef31977d7fa8267b1ef8d2731cdae540c7933dcc7c1289a96e422298a495d3dc2bee9fae2d20d8be3037421301405ef9188b13820dc,6000, +2d9f79b25d6917b960a5f346af35ab1ef1456e8614a55c3ff8e8fbf3a4dd275d17113ffff45531f7d9c06fcb075a085837fee4d95dcac78b552b259e5dc246baef358213033ba3b94c4192ee08c8a99f78f3a91cf5db732f946763c410f34edd,1c3eb256581067b12b2e940f697ebf4074fc09762ad1031e5f74989d959c5dfe174170b6f1867f97a2b1ddeae050340c67bfc3affb130da0b2c1374ae1c9529b,6000, +266ac0440d5ef3a62133d0fa6912e187e2949cd8066cf6afa3716c8fb6e127771d86ace09a5bd0bc1d2751c42f11f526e076619e0d7fae26958395f76b00df7eb901e327568e9b6ec657a1dfde14b5b6a12f5b0910a1a52219255481de6918c8,124866fe767e0fef62ca8873142fc624f455e94f94fcfff2a8664451292f123f0202f0d684dec62fac259548a73b9c24a625fad92ff22cd06a0120e293cbd5e8,6000, +0ab70e7b38d5dfc43eb863190074e8146642942610cc7330d702a79a6b8efdec2d65fc7dcf19cdbc1b60da4cf96cfdc166d34784fede8329fad3a78965745c2589aa65c993dbf70cb30651a63aa9ff39fb3cc568801ef073576dd652dd80943d,1e40c0a15136e7b8cb0b5425f3e35151bf6a414183d3d22008d36f14cabb47c22e827c7f1647d66dadbb32ce57861053c8f75a024b326929ca53b0fadc2825f2,6000, +22ad17464c73663b11148638ed446baf418a550eee5e9b150fb1c99c72b44e9b071159e5556b4b6858ebdd17fe87e07ba06a69790905ee0c0ab16573aa7188486ecb75d4acce44ca606706f56e87887ccfd1ba481c20f06e74ace52ace90202a,0dc34c874d23f27b7b4463caa68226b5563880a4870d1860981891a693a9b39a1e824c69a2187cfc6466d980c01cf6f61d0c4b9d67d625808b31703d569dc012,6000, +258c0ba455ec3cc180eb0a9009ea915bcdd238e1b75b47b1e2fc98149a7c750102a33bff475657ff18139cb1cc77118fe9f71008fec93ad606e359d3a36a998dc82496d1658e009136628b7c62aeb5b4360d780d1915f5f1b21395d001192927,0d2df70d56963c46d29d55355d781ff57f620d7ccfd4923c7b4b1f0d04cb343d2b38f57b2157df927c419d5cf0d1dfc1e5ca46f6396f3ca892de063d92ad0e7e,6000, +1cfcc54fe47784d38f19db129e75b5319299def05e15a93dca6ba25242356cd02fa543f7745842da19a40cf48568c2158c54c3b7875577289d10d4cd5619d6c85f7959e3c309efee75d77b2c837459f52068df62b0b4a57ca94da968fa42af5a,1547cf8deefeaff22da12ae8095ad40f77a027827c2d417a3e2a9bad760391982894c4464363dcaa305a98b2de81182ef3773f7b2daca6f0996a10a249994927,6000, +2a97ae3df91a11654276f1d90c08c3072012cedf7ed3abe3663eba8a40861fdc28216b6ecd8a78e3680b7ad9e3ee140939c0c99b69ca923323535ae5b11c5365c29f6475460e8005861dd41f718826946dd5bea793f148758411d9769c485f23,0a32ceb3bae5b4ee118625cb0a215cf6a850bbce6b87cc4d60613ee0a73a4d4b28a4035448352f5dbae0742d6bdef936a87008cd4c9078dfbcc38764483fcc0d,6000, +151f7e7b615ec8c7a63cec6dbb5489b4b43624c79f53334fef9a9375746a9b771ab44c25a1c1bf2097af7dfe35993a8143fca7cfd5f07602e298f02856405bbfeaf7dc132107772163c3fa109f825612f65271619cccb3e8d1e799b5adb10753,27fb5971880e5edab148280be72026aff62ed9bd4bc413e8209e6b1368c5ac722565c951a6ac676ed66734083f54ac555754ae39e6ab4fd46b5446e8e5b9988b,6000, +0592d6b14a75ac05d3768feb67f5782318baeca742681ab429262775c5b4c3c3135f54b0b617b3bc87fa266b25e07ecf375a4e6c995becc8a5cda88d3249f7f369f8c4578922cd6aa4d100a7ba5c610f7a082fea4979b1b3ba119be631648a04,297c9c4f7bdb8404abcb704ac01508d1f77958a32c2b799935b28f8a684098eb2c50128d58a4ae7c218e1f4699121921d0e7a4e779bba3b61fe3033467b02e44,6000, +227aa1dfd7324c29f38e162bcf8c205593c2a5c7d66eaa1862bd71b66278abdf25d5c390df9f4fbf32b7d401af3fd375cc29998dbbfabefc2ce79ec14fc5c3b322198e746bb15d469d972231912f86b48ef9ffdd260d6ec750ba2220aceb9118,2f37a5253d529cfcf8a687a8a3fdaf0d76f438c7610ffdb3b972b126d2154f9f024ee418b0f4ef8b2ea8786709ee462d867decf62b049a0bdcf8db0db3e05f7f,6000, +08dda079f967e366f0125f6092dee9a6f55781fda0dc0655d543879bcb0c5c0605e9e24028ed5f1d63b3aceb6c2590de06ac150153abcbde6212b1e9503eae7e5f308bbdb92eeaaac0c769dbe9bce04b9c29b9a1bd0980820344907267c951d9,26477eb24275882e219f49e105523c30585f883cf285a7df178412cba0434aa70a08a827ed99c099cebcba196b86a82b7f856325edf13bed7b4c53ea06072452,6000, +05f61fe71f8c26219d432c9ee9c923e1a4d9ebdf92092e44412f458d394f8fbd0227cea1c495ae3eaf9cd74dabc5d89c7bd98e64f1c84aa3bb58e0627ddaf47b6a225b83abc7d6e3f55fd6a956cd3a5fbac9a110bc285b76918ac5633733f905,1e109c9bbd4cd4b645297a1d5f1adc30c8f051f1fe11c057a99629f74ff9d0ab0ff96e1a63320bc8a18ac00bb8607de3aecc760f954825b687912efc677d58d2,6000, +284961112980ffdb843f1e355b6907fcfb4180dff2f8c1b8c69272b333a8140914ca07a1974ab2c951f6cc80d3d6737e835fc12768f4d188cc731c5f2516b9683f2d70ebb67dd08cbc9769834a7f4d515673910309d3e78ea2c299195765e00d,0873c60b5646bbf84c6392acb21eacd76509db2971cc31dccfb143d469909dfe0dd42a1e7df72887ced05cf4272afe8ebb8a35d704ef7b1339ac4173404d2a13,6000, +27ce188ba304bf278a5e9b7f1d6530e3235e3083f61057656f9abb88535a008a210ff034ffd24edc3264b2b6ec196a58280c8a57fcc379f556ba889941b649e5ee638ebea8bcdac57ae0f1234f989684009309cfe5a268f9876d8c5481a5d5b6,2e2162b587eabcda5690e021c4c974ead26e59db7f9d4013bd9d27752d7538001be8cdf5af6a0c9279e92aa65588e30c555eb45ebce7ab5dd50ad418167cd0ca,6000, +0c6cc8d1e2b66b90d845dfe4860b9b37c99dfd6b2f77956057721d5181c97ac7053c471772717e65e3ba25e74032ff5e4d2bcf1010c9f717686d83083cfc54b5c14a158be9308493c6526165b97d86bea4bd60ed5a98a4db3b946f355bcf04de,15c0475d4f145c84459ebc1f952c8b9fb73a13615d6c369989ab75975c9df6e9056b7e783f0298b4b6056e0755fcc74418400dc4f5f4b1244d5752eb4001a977,6000, +089240a5cb9073725abdeeb6331d058e34a07dc2d261dbefc2d64b382d7298ac29a2dde09151a3be54f0d53a2bd53675c8a68b711e65585065744c2447480d8782a51b5fd01000ab8b1da712683c39f84dfd28deb61c9f8da1d8b40738f1d8d1,1dc12d3d5a4bde53e4360cc5f824bd6ffd988ef1a0764e397f0ce3d944432a1824edfa479b806201b44ddc303b4a74db0b4b250138c4939d8a428668fe36b2d4,6000, +056ee0e5461f59129b9a2b8f0d4f254ea49a403205ceb565379452d2f88b98cd2c92fee2e291cdd1235d9f2141bf3751f7e24b606a241cbca7a139a7560b9a4a632df0a17d711214c61b7c8988acb94484f6d7241769874eeb5b9bde44e4952e,2e426314ceb2bdd6b8c75d1a882bd7e1ef70085f0d95a0e65a8aa8329d0180af2e38014418e094e402896bf9b08b7da122e92e0235ca15786f56b5a10141b755,6000, +2501848f66761cac0b734c70dc743d3f156ef14ee0a0fe012591797a727a9b6a14bd4703f80183285878b31e67ebeb916514aa7543948280fbcb046c4a0bc3cfb97cd23119442b551439aee6a77d4407f3b39985fe741557816368c6383277e0,2f03fcd8bdcdbded9b18dd4f4a3dbdf92831ba9e02185cb7c2642aa384bec2111bcf7b3b3354e3fda690ec14e858d2b126ee1b4d03a6ab2e8a8d3c7a8134266c,6000, +00e1a1007c207102b4ef8a7ba74b48452c555e00fd59b7b5ade3e846826ba4de0850cb08ee07e8914f31184af6c34e801ff084d987fd59ba85bcd695de1bee757a862d66a09e712f29013bd898c9cb9d2adddca0f3300f7ae1cd1d5f4813a2cc,1585d89fa29253e385e5af5a856df686dc6e85ac4a583ad80d751c2d758f4a2627612b4c04e83fa5dabbde95ea39b3697bce558ff11762cd95a49e9936a94038,6000, +2d95e33eb1cdabf718ba5dee38f5ce32dc37aa8d3a4a2d72ad2fad59d50358bf29e6773c91109aeae3be684d55b4b074feac53c2b3d35ea30675797e849146c61370f583a2caf1f05bc4ea544a8c6b3bdf5969f9b21157169d77516896275b5e,223cc32825826b046e18bdb12370ff52169438ba3271fbe89cc3abaaa58ef4b9128f69a4ea47bbce874d46efd64887df3febbfe941a1aa9a30d8ef42c0dfa8fc,6000, +278c39807edcfc0e7b1017a71f489ff6ac7886f635498686e2ef3df41192f8b90685d464c09efa304da4457e93267e36369d4257ea5cb6fcaf10a26aa8654e9186a981b9dc1ceecdf3fd48c7e0ff9c13f65e42e28e44cc42037651421f24335f,1125b20d7f83d0081e2f2d68f709b09ee5f76e534f5116fd5919d92d500a98ae036b8e9021c2c2606758cf3499de468e2953265542826db98249aac365086cdf,6000, +09e7a15a9feffb0bd794df3da2af8216d9ec4a1394cbaa0b094fef9fa3de818d052f97cdcd08dca272a180307db298b2f98508a94ab0a6124f1aef3d4af9e9706d526fe03bd030e751091e70a88bd1c5ca09d38beafac3bc4162b51e5838e2b0,1e8a2d9f54499effaae346003fb1969862623ddd8834774167c036f430f32166105c26ef4003a70e0d7200b490914d3c802984885d0d7ad8fb60bc9b96926172,6000, +1672ebbf9a223c309de515759f4d81c3e4411bbfc35a3cbf33dc76d387a8c5852d239f75de96ae29c73e449a28b058c63238e8206d052d76970940855e6bc8a73d9d9692cb05fd1f5d08b70472ffb590420ce8979c021befb8785b5620bae38e,274c6b22dcee8814ba588e8e254473d05d338825648c1b01dd67f512b04698f8053eb3086a4d6a5d721eb332c41e7ff8a06481a29b2a5d90d5f48f583bd5ff82,6000, +2db92326a7a142a4795e8c76935f2b3c4a1d5fad6e2de9c2a89e81dfb189b103053396220d2632e1b9199d180960497a7bc651af1ef42afb379ac2a8e07f677997e5328372aa436687a6032aa9298ec21870708d11a0660e3dfdb9c3f7bc1982,1922c9058c02fee316516eaff0dfd2caac45daf439379904432f9f817e4af9961cf645979a4c8ca234a1c03085b5473d2b3093632d77a3331dff3482cb851b18,6000, +2816884691f0c6f63386b28fc8eb85f49b8efe97117c46dc15ff6181c972c73a1a1d6f2af7442661d6d9db7fcdc387a2e3c00d811ee9ab6cb8ea2435abe1b6940ba3e4b2ea998a48153d9c1f6806045b859322c2951e5002c0fb48d858ad0ddf,2faf3901467e24a07fcf1101588aa0327cb3c64e80a3af0a5a1e702ee7a845e918d9d6cf756b27d9d53b6e2091e782f69c6f39d6335872910cb1b5565902f334,6000, +2a8c6cfdbaa005839ca9bd321a924a1d049e13d671f17601179b03c64ba17a442ae0c71cb36dcbb32dd09d68f7fd08faf70984795ad7bf771381cad518a280c43a665868517e6ac96ab2a5c15164b831d7087c443cd55a4893a1e2cd9beb5a84,204d23deec37c5bd8e11a705d8f5ce2ab223233f5d5b9ef07fe30a251e70b14d18998c84a7a088c745ea9d486b3327d2fab365c1f5c33befaa4a644ca1eb4ca7,6000, +28f3e4ac2b289edd15bc247077670746b9114a4610dbe62cf076c6c85b88724405c23325ad391fd425ec1b43d8cd8dabdee60390b7840afebd5b97a870a889f064ec622fa6ae0360bff76d19780221a7c054d8d9eda3d626aa4608711d40e15f,04e13a12f8e6979bcd648e3b0e8eb539972db630e8b211d22c5d655e1293a4c21fb15b5b7a99bb5405eef6301da6550ebaa38fcddfec439736c77629fdc63f57,6000, +0cf31653ab3d5c4d5a3480a4c02c1c2a392d55a67ea832a3e4c4f0871b3615452bb6bc6e42039a7fd2115d05571a6452016b4ab599088619f26e7ca382def1e53856fd41c6de451c4e96979fa4b453461d3c89553183df216456471c55b1122b,2e389d0e3c04e02340d692e2fa9f15fb954143451f87bc0a88912a58229face81749430fa3fbe8e259e8204ab27ccd476ba962d4f484948bc3af2fbfd76f5cd3,6000, +035ffd7b286b6928a9279bb244e0783969d8e443a54285ab96a3ddcae1c7adca0a6105d5e52311950905825870fd0da9331ab3b2ce03377604b13a2130a089b81d087c4266790551858b5a66c544e4dc31d98042410e7863eb8ec80729d19fbd,09d8dddaf844326ee0f93181ffb19bd22bd689dc7d0553b4962e817429b9b1731f5c4fb0997dda34a25e5d45dec2c290d72664710267ea826664be35d237669c,6000, +108d1a23aed47be7ab03d085f4727302ec1d59499ea829571a348399e1acd9412167f9bee144ee806b1d46715429409dcc5237c26241829488daa8ed7be92d83d6f21b9f5596de8c7eabf9a2157e8423f66b6a0e2e4f4161589775d1edc84a43,187fb4bae9d5d20f625f42a156dc1d17f9fc8d67128f15fb884b2ef4ef522c3a0693556124eb64e1b90ca74d2bebe22fe3306a97353817013e80c6f9a090464a,6000, +1b2ac7b620f95e1b2d1f389d4177ea9452c7db405943091eb619ae38359a6a761a883ffeb24fd35bd57cf605114447a79d1da78adc104def436ef762e44629782af290e6b7662ae4a03da5494cb35122764ea13418316d439decc59a9d3d262b,00c7b2e04547d2571d3e11e54f6bb6f8d1a5400cf72c48a450c4270f3070cf142a0042819dc25f213e08f9d8e440f523c2d27fe3707ef54d85814cbd6b08120f,6000, +073cd84b76ac74ac7b761f51d00e71afcb3a42152d7f21e50022b884b27f72021e8a9397e6ada31a6af292d89bbd8cf66388e159406a5768b967718c12e43e918610dee68954309218f363aac8b527b016c8bd0c411550a71a80dbcade521158,15d2d5dc7b251896f13664b0a7851e02c6b2b9281eef7b03c1424b3700728e8905efadba615849ed86dc0d974aad7f1f30914dbe389ddbcb17c16b9f414cd954,6000, +27162b111e42d8918b31568ff4bdc5221c4239a244540d9102c7ae7ef409bf3d0fed706523dfbc8362b5f6692f8cafb283c5271d09fabc69540bf8e1fcc3ec852d0f8601d0528d9f116e233a4df1dcca68ae5dbc9b8f5759157364b89ae80d17,08c79e637c181f1ec92cfef88e3c6a40050d1c7266f13b70e943df07abd6a3d2192b4da49e77e10ad916f8cc6897cd683a53d99b351c00fcde3f32fd7c0e8d57,6000, +249b08d5af647c129b48ab5970a4b0fc5a8e27e071bfbbd8337c3d717975d1082799b77cc0ab6efd74c6e0a904e1ab752656097365ac7b5b8926853400b438635fd9534df3724c158f07b30957a312635db0d59f3ea65c380ab7e6844cbd5d88,183f1bae99065a6b255b4c24f2f97bb7854408f917b655d0cecdcdd5654e752811ae52b7c54a88f1bf1cdad36e29c3d5e3b8f25e8e7304f5cd05aedb26a1559e,6000, +0b428fa9f5f33857766ade65c667963eaa7d47c00845e12c0659236c55e62be82bbc490789de02eb6d54f31b3816924e9e212f4f77f4bbd213e6fe1f57b3466c282bde731ef0593f634c2e3662632ef8df04ca27c7151c8c06c83b52b46e6b20,2ddc74bc586f24238673cec78d6e88f5bdc83376820de2d1dda20110d32d70c30e28e12bdd09159fbc0fe2e5dcd44b90b8da0d0dca498a9f6e6534be7f7b4e5c,6000, +2978a7156ff927cc9ae4d97a4e4d6a6955d2754cb2e1301ff7c9bd2553dd14ca2b0b044cee8cd421b86be765ab5a8f9701e98890755aa7a14674f7a1b63ef2a82ac009e47348a515aaf42bfa035203e8453b6ff6bb1a730b1a32c5683394080d,123f6a9831525ede5f6020ccda7cf0f17c24aedaccd1ee969c4e61410e99af832c52670cc5dc48a9bd4a66e6e4f5c84736e54ae33ed546aefae224525a0d4554,6000, +2ea79ed4048f055176743c0c876e089b5935ce4561399c4cc646b11a183e34d10e58bcb407934ef878e217ed315510e10134a28cab24656f40082dfea3dbd2b2910e0dad2dd34b4421124304d7f7fb839fb4e057fdb62e12a3ef685cc8ac1272,1434da22a8a39639e2213d5cfe52a88284833bf1d1b9b14df2750fdc0b7cc4e027f13b64c5f1547409b14a4cb73da21d4447b8bd955383df3879c74cd9f842e2,6000, +0e80223052fd88c831261a77e7c9d4dac8491f416f1ac3a71bdfe9bc6be06f851f5d961af6f2fff18b4617565b3cdac9d4e98addc1d07464a249533ca7c7104fade0cacf6bc300050630ea50a892f0f5b930167373a9bac3de9d035d9a200550,05e15bb786e6bdff43d2e75434e40559d3b505102913c687d7ec3551e2b569111bfe389ac8d3826569aff3c7423f51d68c8228ad943dc4c240ef25095590d09b,6000, +2115376b996a740298d6a68b4502cd4932c207860d36e37c3901f3f3b9c9e8aa287a9ed0828daf90faa9ca713afd70df2eb41ea02e4a866f1999d713e7cfbaeb61619267e9b53431a9996fcb13c3f75e6a2ee66a7daf87093c1eb7c09aa1e3fa,19ff5162d1feaa049a4720370ec8083b829c1400b8b02352efb5b684c2ceae1513104ef7e7709acb08546106720de05172980336261b1719fcb55b2551ac1b8b,6000, +1d5a9496889a09f861895269c614aea9b5f06f6aa7bb58b4a61e0b9dcd9c5ae1187943d7ddab3f2883e7ea89e68ef536070a8aaec97856c91868693d0709e77098a64a2c81e3b54289464331d50dda77c95e792238728c1871ef6f461ee5a351,18d7da7c2438963e7e89c246c5ef006eda2efb15b0dc8b08726dfcfeb698c45c02ec3cf2c95ac5eada312754e13c2e15ee1522dd38a0730ae7173cd69c2255f4,6000, +2f028d6d2895a661c0da2e290e37b405112c2237e63e07052784c267cacaf4c92c8634170145f6bb6d9fc5ba7d534a02ce04ef954e1caa6b0e6fedad1ceffac3954b7e7fb9881a258def075cfa6a5fe0c6b1dabb6b8bd0d07d7f100633d3a594,05dd77173967ab54262ed789d20fbc103cb5efc34a56c86801166839d1e1e53d1594cedbbaae8bb24c3e8b1a16e78da535587bc7c744bae8e72fe11202acc58b,6000, +0df4e819d753b881c132229bda0c97e294e4f46fd01739fac20a01ff7eae95c824f01303acb6c9786e98da7a8e9e9038759828f3dd7cac15974d6deabe9b6663a1c305e639c31dbbefa0bbb9609d08e399117bd4dd9fd7f173823527513fd367,219a37f87c89e43c34b86d43d1d0bf47299c85712a0f4feb41e0510433a6f23a1922832d6e2bf0f126697f644688b877dc58218aa1fc0d9d174c310db56b37ba,6000, +1c863edd072384277bf42a504de31540682d98734113dbfb713f374e0a12f9690482f24ff5496fce90830010782359fe294b1dbf2c87ea531a3ff8426119d0a130e29d1eb6cbedb995f27a7da217af3c09751b646031a1fd49e003b001cb2db5,237bd299ba5dc1275bb49476b3df1bedb0cf1b333093ea909917d429f502039111416d0e990a697c3eb92ecc786d2fd9199716aba591fa2cdfab24a534b8d4bd,6000, +2ec25368d90dc1e61007667b52a4338d57c0f89394b62349787dc7042ee704fa1691061890759b6c45aaee3b94513e10ee9ec6b3de19e31858a8baed060128b8e6a12bec4a64dcd7f3c72132120347fd0826345756d5ff2a9fc51d417ce1cb77,072c988b34770cab4e1c935ab310eff273e81181ab1f8747e4df5374c855c0b40382bcb18ad62d4a354899c50171482100d2abc422da3544f7d7e7e0b8d10a9e,6000, +19b3fb9aa7abcfbba37c9413ece6f5b3e900a95b8b38c67ec4f667bc35312a741bb7e598cea994163e424f947ad02eb9fa3f79751ce4416a6be60ce7930c858e23d539a2794aac760b4f5cecc79e18447979f12e9c2df00e00fb204570bfd0f2,02ec54a3f92b24b5e98e1a6241710f11f4daa4d872dbf1f82251f00b375d936114f816876da0b4b077a96d3959e7f38dceaa72b817fdbca84a49b84c04aa6318,6000, +13bfcc0b84dceca99df210f6c76206b3b60ce13c0b1f3cfbcae3c00161165c05278eec49003ddd859b34382f5f1164d9ec7c53893b1d6e5b6acc1ce2bd35c4ab0ed91b0baa60cbf36b0f87ae80f0d4e4ace48beae030f877325e42b05c4d8ae0,19383976b8cba3edf2c4c307d6c1e07846807d74d02434b5db3e62ec50b01ab815e041be9c08e83f9ff630185a4dd96a68884f192d79c5d48b16ca6342cdeb91,6000, +2dd99890393bc39ee6f8e451da2514c5cb0e09d848455ee5bdac36564ef99a5e27a08aaad026a0873a3340c5bf50cb556bcd7b1d6a788e31524921404d0a12b6267ff2b88dea2f10c00197353e17751999c3b2e600a7b4b91f114f5027c87f8e,1d930653ac5ced530e6d095b969ca9bf665728fdfc52a7012b4c36c0e66350431f21ce0559a5fe4c587d4a0274a81a4aa92e9e1cad2fee1e4d2b78032c9ed593,6000, +1020edde3bbcd35daaa21d988849727dd8a63919255c463d0f1beb72147145b11291bd8d4a312f6b0e11b89cbe5ce722a69206df479247edb6971645c9aa03c0c5e3d71f2f6929d59e8929e903fcaf64c3631bc8e9ea392d45fbdaa6b5ed47bf,2a8da873cf712e83c08f87cfea2d332be31714cee4bc2b7222232bc364fb996a2fc06d4a528752b3111339044bee364aea0041bd11bee0b934bdcda53e210ada,6000, +0ecbc40affb03afb2cb9c4a9807faa0d5392dba374ba1ddbf08ea0efed1515e90837c383096d41de63813be64fe748f58212b29e52805a72c7773248f9a4cf33db78ecb320266c02e17ad7da801a0cdf1962476e3d21a7462f99713ed2eb70ad,12071f5bd11ba980b30c1607bfb070ef9f869517adc09c8ff420489e5a8ccdfb274a4b0609cab0cf33209a3b7674ddf6c1baa8a280a27de102ac971e9545357e,6000, +1b3d84587cc3759c1aff13effe99a06b9f5cafa6cdff25faaca7a1cc1387cab4100fcbfe7df6b750d81ae835f344ca0a42a4c9a161dbf7c2c0260bd65de6da5bfda6360e62ae46185ccb5cb27bd76e08945a2a812b5784adbedd573b3f572beb,2e4c2172099e3ae2da9fb535b38e1a1748bbab0bc5afb5959b5d5b8f6c547c44187e6ad7f16a38562703c4f0bc5fc8716dda7d9ff120c5e4ce743d2b0f276fb0,6000, +0dab2a382c5f79c57547061da981daa21c390d151b75b6438d9567032478e2842a74563f62ec08f4b1f4545c193b905ba5844faa784b405ef0f62647a19217a1a8405cffefd2ac0de4670dc085054c7bb9ce403754d44052758ec4b3ff96a481,18ef1bbe7239a4a0fb844293a6d05d2f52b2469a32e8de1eb697fe37024e3ec80a5c0ebde6ba634e2eafcda3534248d0cd8cf70faa45da59dc6ef9f953c3358e,6000, +1691e921fe13d069f4408d4ca762a28799df99f9df6ce3f7655ec66764991a4b250eacea530032c22e92349798872ecc88cb9317a4d076fd74478317c9805fda13c01967bb67aa2dc73574fd965a0aa4f9a0353a4ab85f5c461436debfa1ee04,2e0bc72f85984582cf946cb983baaeb50dc8a60e3e64b9eba9303016d090fa98070c3ceec1a5b24a7ccd1d6167032356b052f951920060fdf75ec99bda2e2674,6000, +0c5d403d023f33f2dc6370e01de6cba3ce41eb31356fc7940824f89bb1315af104c231f49aefea69c732d03b6b6937556c2b97704aa30c8799ce4cf269bfdba84738ba340099d7711bc519063be084b467eebbef100d83cf319bfab74d525cde,2959c6ff6a53b5926095f57a037d68e6dd3275a1651920cc17f8dfbbc88c4cbe254f939eb04294ac3f868ad4a008ed8bc78aed4358b7f2705b1ec0f8d93997e2,6000, +238e07129ca84b397ed0954f00731d88285e4edb65c49ba095d3ce26804b51990b63ff931e891db47bb78d54cd8b3bfdefc4ee201da6ad27b9e36b64c7aa1b79f308749f1236e50f9e80d094dfaac241ed3daececd8907377cc395bcf7da6c4f,1b8aae8c940563c0dfe68da908f44326aab04ede8182b3f9fee2c03209b87c71095e309e9ea65af3a486a00a1cbf7373d8a5831ec353d19e2894f8921a9f39eb,6000, +2b7bda523446f20e240be581a67dd0a524f9212d89833d17f03b7a9cf85d05c1242ada3fca004e715ec6fade37dc448dce54727b4b4a847ddcf62379d970e551957fc837908e20daf3a773aed69d047ba3f77ed6f74791ca615470ac3d23e406,16c5d33e761b7397edc7fce04a50e49db428331bd256cc7ec193af3ef5e308831904b68287c2bd45268fb83e758c4661472c6de01a607c57b4d39d95755a6f82,6000, +0feb50077d23ec8ca3fc72f3ae4428ad86518597fac2b73286ea8f7fd70118f02cfac6dee03d6d619d6ec693a46ba5a37bf6e5afdc908173b4a6202e6bdfbd5fb9abc6123aa253e5ad1aeff3842cfaefe735269ca01111033172e9ea42c43824,2885f2a68f0d6f8dc4afd7b59f7547bfc49d8ea3a4b5883e14cc845f63d1ca0b1ba2077aa69c26c33ad3384e1d38a2f55ef01a5af13a95c8ea4fff9b2b8648c8,6000, +18469a0bc70efca377a572a4eb8ec0566d3615351372ddbd3c80b89709303ca92af0e367cb2b37a9122c0dcfb5bf9f2a266cdb77be8d1cb6390a07d69b7faf73a39345809156495726426655521aad24c97735f155c852084d4bbe67b9bca6af,20706df33544c8c1b24fd44d8f2ebc93199b3c07c20e67f7c39275538d0522731e8d3edbf6a058c98cb2bbaf02e9e71001458ab8193157bba3f74f68d77f0bd8,6000, +03120ce2810a098308851e9a8bd24adfdfed58b93441d99078a441a5d119f7f727ca7ac707113adb8c96d9971deb5d9114f06d09c6bc9ebeb08fca4b9aa8e7e9b11d6a9e6ad4b16366c0f4b8123e44432d8c6971d6c81f55f5a67d217f440a94,002e1a076800031b7399c631afc79971ea72e8eb61bb2cefce7e2211edf899b01d9e0e90554988a7acda320ab1e14583a1406bf5525a60143c5dad8618ef206d,6000, +0f570d68499dbaaa6ba8703e2c38be2b41466352fab8a9a0796d5dd2f75fc4f91f2a51c454c4c6ca15ef68bc3a7605ce1fe77b569399bec27136e4918fc25b908020e5c253d88400c88d8a0b6ee6bd5e996ccd2921de317692b257be52db0837,07e69df22ef958900db6921ef759fc96a3891c9a72d9971d26ee8317c55a400913d562dc8a4bf8e0abf458b579d7cf9e66ce2c1dcc83556e185a2521224c9e95,6000, +2b4d0121fc1761d05c9c55478bb61834e169f7b97531d66df9d13e3c0a457eb818f76f18c9e2c410c484f9f229b35ed3648084bd592a9726245f2cdd518f01f16c8fdb88c9adcbd283cfab7b95c300dae36b06426420a9f959dec63160e095f6,13c2427223439dc88cbb5a1333673f47b45de074166f693bf6c64aebdf70bee0229ac054298faa52001b0a7b683c5dd6d2e2ba9edff7587dc1bb0ea3e613629c,6000, +061d6d053d3561e2f513eddba62021098bbb61fdd2fe8bb03a18a9d18d0375f904606d333783c3e96afea1b892fc031ca71d143e110f732014a8b5864480e8a4e5d1338089f4dc4753edbae4998095a5b00315b61c800591f718d20bfca4de46,1b415f6e42c5df138d74fe22feb5b01c4ff165561e86d383bdfd4b995b3b517d1ee9f368ec8b3fb23cf2f8b5bbc231c39eccd211ea9eff5b27451311fb4fb399,6000, +26d14fcd84d591aea6900e684e74de5b439dfee616920bca8fe51817d3c799271802627c1119cb7c34b75e73f264c4b2286e9545fc484c6c58805def915911aec5a278290f72b36f9f7f5ec92938dffe97e32528d17462d511d24648118c187a,2a9b5b689d25450c6f527f52fd0d827a1a3191f535feeecd822b40e8609bd439210ec1a657118649994201678a33369a966c50e6fb3df48d8861bc6531fa9410,6000, +10a1bd0fda3eded71684cc368f24c89e84eab713d551d0d8ad8382c1a27ad35316416632c35f01ac41caf996b35779786622cc3ee59f2dc4f70f584196c698af8470f303cf4d344a1f93bf596a33c210771fca265f82484216e3797f4d5f99e7,04f02d19950c279926c69077564e97ace7830021b6a3a2bd9ad4c8377662984f2583db1e199dd2df32ecbf0d2fcb1df3201cd678057c97239eadc4edfb32dcad,6000, +2e95e54ab27142334b8c06bdbef3bee1dbba5df1ffde03852b80b545fd78317e092d43cd34d289ba926a82c87a0f38c450edd10f60ade934f4eb9976a9fdc043b385a734153c205356a1d61c7753d05a74b6eecfc5d9e4133941433e4048015d,0eaae0afb4bab5d3a574dd67aab9c27aecd21079d3b8e9e76361872916d936ab271ea16e85ec2db378ba110b4ccd6a0fc23ab583498eb716e5d21508d2330ab2,6000, +258fbbc5fd15ea4e651a82a8fe5241556328d9c314a367c7206b886664f767660054a12fbe80237b99c507ebf15ac95117f443262f455bb2de365b4bb7c1a9805843e40cad5217d21e82ceffea77248dca38963dd35dec4da0449536ccdfce85,1ba53e7e7d81145a4ee57ef0020a4def170f1222b5f8e9aa1777a922696e8a050689e33627ef4c32644d61f5bb4617f6920bdd11e14aa76990671a2b80056490,6000, +1fa8ff96f01c35195ef5174cbfdcd1e4691b59799600a448709c41f0c81e0dc50a0395fc74b82e728177e84ec5396ee9d9fe324cff68dc2d782a5718542b8b1cbfdbb9c80ee01a3ae4b10ea1f73c802a090291e912ff4838fe89ef7b0e265cf8,02102206cf655bbf0620df4be8585675b88f52ac8f50939a1b6595a791ac2fd4030ad0944bf2d7b69d2deb8fa2c4b3dca5e8ae74b2d2e68de798b82c359b9767,6000, +228db07f2585012f0be11fb2ab3dbebd653b12dd563a0a85c2042a3a7b6c3e3f110d309397f0e408a2e5ff5c2873ff17ce2087e1b0a1245a1260fab30175a3274eb29b2cee8bb8de359f6a4fd5ce64a6f10a70ab9c7490b8e54207b59edbecae,04b1debe9feab191311f012409977c72415519544d9b22faf33fe0d768d35c7813b686c6e3ef53a488fce3c42c1898977cfe3242ef0e1eb66e2ff9f15aab08ca,6000, +01eb0c2d0608c0992198fb32e9c35a759725931b214b4504c2c43ff99a22213b2464cac09e42e8a3303b9fbab3ed7062ec2e9c3b97bd589b4a2731916b7ab825ea36cb65eb27e9282c8da6b4d715b29c7e899530fa82423e48d25e4b5bfd1061,26efa53be7f6cd0e091fe3086e54c8840fe9313a43ce7a5f6ff7f11ae172a881256f85bd8c99a48b6ea07939523f4e904aba23c221301ca2fe14b6dc9089ef75,6000, +1a18dd41b9243e13bd8d729c842f05a7897a6f6f289a38bf6282e1ce9421ace3014e2a0c19a26eee230f14bbfb27a7bead850e9f9091cde48892d5fd142d821774705137bc232430620dd523e088e043e0ca6cdcac89c6b9d99791999047a86e,160b5364a43a0ec62b0cd97e292b9f53a8262894093c3e1ef04ab8db5a64db8c0a4c34cd0233277ce37050a21d05ac10169eb122e9f8afb1c20dc9aa8b21c0eb,6000, +02eaf7d285aa64448f82db1288aa6ae1fdd1d61090c6a39c94e9889b1ebb90ab0075251052fa63a022a16b8e0affe53906f3bb64da5f09b956c4543b9aa0446b973ae93155ca6cb1ff66374bf2b04eb9e689cebfec804af7a77d6701de97ddea,2f7e9c8742a64ce796de24082d98a603b41d73c158b987e606fe454256a0facf2744a586a577c73dae5bee62815a63d10c9a35d7d7e2298c2bee6f36b7f67dda,6000, +25f2b73bf7bcc60a35d13b864cfbb2b94019a52a0767f57325162ed927ff6ad701cd94a390d4c0ba31b9b8d0eba3b546cc611e4acf429851671e1849f50c52fa83ca253a8399cf0bd7037da57ce2306285dab2ed811f9dc20cd04e5a2edee9dd,246fdb3accd4458ff229dd1116b4029cdab791547ebf0b1993db05ab54c91426213372ef06829ecace791f7df011333749a666c903f37da4f5d103a65c987951,6000, +1b23f074ffa6400f4e9c6e759530b681ed2fc384ebe6759833b3eb60e4c0e3772a36f741dc3bf93e05394ab3dc52ec95bb8f691abd77511ee33e9ccff8b839b33bdcb79793c1955148bd351d19bce188aefdee26f3b55c27184a63d5908a2704,0ada0f3dcdf521689710e0df0996cdd4cf4762987c3f8f5d259789ccbd9d4b15103ee5ced39c95c75473c17d3e800e43edee9bb4c870981650954862aa96b5a6,6000, +0ead7a183556a61044bff1656f596ad345cd2418564b09a1143dc5f4178fdd3f1f197e020e4d2e2e1bc3bfd5918f0b308a787bf389fff62817f2d98c65629b3f460af9c8b4a5823aae18889adccb713918ff143cea87d859abc750b99ddab7e4,0c798ce93b0430080d890e3b6d3756082b85266b418ba2600b5c83d3179644820e4a06f4395b64864cc8e6c4737956b57c326ded79474278c9a1e15fb8edc7cf,6000, +27c22039211da5542f020952eac0ed2d17478331d3f47d4ca041af52765553450bf28472e50b5889670a28673dc4a657a3ee9e51b131560d5edbd7bc3a09adceb89c2f1f2a6beb1d392f2f252edd0d4e4875fbbab49a35ec3efdc331b52af649,24d3b3b3de8b28b6b2f4f05bba96bb08279bf852d3dc48236b51ee34bd981bbd07c816909aea34bf542550fa59956620a50f90b50021a1c4c991cd06a31ff9c9,6000, +2bb02dae62e59755cbd1ab17f53a6162c32cc21d5993f90ce60b8dd57309f80303a980daf9a0e467b14d74903d964490900641741e97105f59d85e57f7c5b195ae9af9e97c01e0d571985ad416d1847f02dc3d2d2df0b318a140b067de0c9383,2a08d3a5bb1bcc8787d979b5cbe3115dd655ac3173e6185faf010cbfa5ee277502e0d41fab0d82140fa7f0099d3803f6e71edbb5d33f97b0f19cd4befa31959d,6000, +265fd632541c2a21f99b2ef007c2b707ce2a44056a99d0aeb45a061512eedb72071c2c475ff26c1a21b343318a7f69f1926022e6a3d1f3acb01eaf860958587ddf479a5917e7c8001ce6f686f7a866f2a3480bc45c8c653b0764da8e971076f2,2a793c6973dc917956cfa91dd6c163e0fef86d993fe33a72c2c5136fffe38f8f29735b591450caa7352f8afd0a4bf00f41b7e03c0f7e06d319c2a7006193aff7,6000, +1b3354daad06adc7bdcea13b146a915b6b749710f7e09bda971124bd55b4241717b8c21166e1e4421f5e80689e026b6a2a40d02e8f039f8ec59a82e479e8c09fdd42336838dbeb71ba083eded2ccd99ad1c4e8bac79a06f7438067f4e8b68dac,031a8665121bdf5267e5a52780a2b00c8b6209ecedcb5ad5473a2a5d5a22eb9328297e19b658157d1d1182207fa37fedf110bfd2f5aa462ad3906a1b473593b2,6000, +013e7cf1a61cb726f0d1f93e9f7157f12013f2c2fef09d7bc56dea4709337aab18eb0d448ead49344ba2d8da370167f26e03819012da2d594ae3dcf49d569b7e33455158106069a4af60cbac93da13215c59c7810e0188011924dfe93f7b625a,27847d7e9e139a725b2afcbf3f45cc4aefb01b8d90a6da4a043461831fa01f752f6b3ccf2fbf926c8abef4d101f1d3e8d9bca490af72ee4d3252e4838c42f58b,6000, +1a5a82892eab6ff2450e95130474ea87d5bd874b91da5d93220eb2df65f65d9b14f7b6357388fcace1504b97f97980c5b800e343db6bd5d861526ce18b03626ece7b40e11e1fa62c24928e828ec4f8af29b20ed5b6e90b9e291778b2e109a24f,0e99ad6c1f05f8b26649e1d01ead1bf5489fd11b7e420283b75134dd99bc51bd188b14943596cc98d4eb355b5367c25b30afa203d03dad3f5f283bca87bf55b9,6000, +2389db40375ab4f9257c45f7d4adee4f6568001f5eec433ff03cc8318e0473c8125ac339798e428b801b917bf6880057ef56784eb82eccd530d1bea3573380b4986d9b74411ac28f6012f81be5a1747061b68dafe77c03bcf34d65d0dcc83e94,2565696ae8c7479204cba51c42184bf2aacd5f1490035fd4b9253a2c66f561c5294c454bdd271fb69fd005fb37112a5c59a6b6fa16825d8b8034ed9ec6c7cdf9,6000, +1903a267217cd8dd6edf8cd7d0fd5c10f43c168f95d13a3d74d8d30eb125b5271cf2bb9cf526ab9a4b1ff594b6483a917a41ec89a585377fcc0c0eb78209d4a95f2216b340ece058974d11123bfbbfbf5a2cea41863737fcc19ac058afd43221,130f5b7af9c3672e43d9c37f2b361943b8ac8444f387cac60711d2ced74a47f10a34643ae87536a45a8b7efb8937a349f6c8a4fd7dd02e8459c6812efd9e189a,6000, +1be97bbf2cefa029f9bd4209aa1dbb039b4f0a3949399e06e803db8853831a3a272ab060174d99b8d8f1a7640a0e55cc71913760fe4fc225ed4483848588f0415b51c46f3b891ae3629b7474fc00fc7f7f153021d94491ee867801c220ccf364,04396bbfe4ce1453ab63c9212b257c51e83832216c5ab84ed9c5ecf3e6e7ba4d2cca6acfb389712ae24dd131b5bae9bf395f0fe6ae98312e7ffca471dbc29ba2,6000, +2ca9a746a3fe3fe8ddc46c2f3ee5844aad2f185565f7fc95a1faaf7c1843291a2ef43e2aa885b6ae45e14b5ff5a6d4461d006819404bf25b3a927197a5cd3159826fcca0f6a570bbc45bfa869de647335bb819e13b6d6d9459d71d86ce8ffb0a,19e4e95267ee36d7cf65f26e4175e5b73dbd4f037ca1f0e6ad5bbb5d6a86de7324b5a969b33daedd82d2e823aeb996a9296a696ec34f1c4caa03b58210a3d08e,6000, +095b72b76ec39138b40db914787f627c1e048795f87adbebb066dd6a77e8d854167b13c8dcfb05802ae4de927d1a737c5971931f724818b38a3ebb9a9aa0b48abb6c624b8fab6463b4a097c0c6550238f35712e44dd81a2c18659f2fa2e5d945,0dd67e8947a4a5c77d6bf1f92a67d5ba054860d9bb86ef7b33f57294e9a2e18d0a249f2671c9ac9ad79da6cfb1e49888ad9d080d410bda227de74f0d1882ca7c,6000, +03f582a2e7bca867d4c809242e8f8b09678176b7ea9b2d7c2db9165898dfd30a13689ab0929c0f0e10d27b3a3db93b7691d7282c68836b156d4335254d40e4bc89a4160a046b16aa33b09010a75f7fcb415f46b235f23f3241957b11cd504890,2ab31db38c1f2e48d5ca18e7d876dc1ccacb1a7c53845d7d70408ad47e91eb901153d9b683c9225a028ca329bb152c03a628f6c20c107d94fc78c9cdc4290b01,6000, +1d7c24ca6c9c2d624e15430e046bf5ebbcc2b5e113937ad5a7742b475d943ed71ad0456911aef72d015fef6394edebf1935ffa5f7497f02c48a1452b98f54515ed04b5a35788d4dea479cbf39904041dea08da6180e4eae85768f00aa5174782,04283817ffd315b362cc1264eab60fb170afb18d4e1cf991a44ab4f778f72aef1b779afbb406d8b7daa13f72eaeb117720095de1511db767bb96b585e4df9209,6000, +1602176c02d25b9852b0b2b625c12878f72ec3d24478d2b7254325c85642b4f60c90b637bf0f6143097de95e09842329a24f1ddab7c6e421a02759dfdfba530e5fb9874f8a8db0d4b93717d7bf51beea125b0a38c7e18ce11ede32b2ec28c56b,148836d92113543fd5a9231943e40ecc6fc7baafcf5e5800c96eb97da3831aad0ac0bcf49fc4e1f803f79488ffa522a97c2addf365c90152d6d50ac606620075,6000, +126298325167cbef0a4ed883582900c30261d0bca44eadb43426f5ed6b94f83a1576132f2eeb53e0e5c79f87f4b00ed1ad8260b289ec447af8c665f868d7140dabedd8bae36b2bbdd639d6e4b68208b73da0cbc144ec5afc9edc0cf8c6fdb3e2,14a1732923afc27a3984ac79ee0da50d8a63898fa633e6133fc67fb0cbc065df2c1e5c59cd941641f5e9c40205d6942e1b2114d460d5ef2e0ae326bf2e0785f5,6000, +0389fa6b9f95456bd84d983898cd1e672a1affbb1d1df04c4889ba30b6d335c1230fca3048767fdc0c0a35454690ad98b96496a25514da3aaedb704c6320c03c5dd8686b55a042106afe9261932c67ddc57e4be217c643b7a9427d7ac047b886,252344c970f5b2da70454541a508391ebc1eb82abcc174b2e0ba65de026a72eb1a59711085fd516553df6523497589183f8170d3e75a54e6e8b591787ca40926,6000, +2a8525c979d6ec4706831124951697d986cde62c246f8281a0c2fc2905a8a3da12fc0367a15ccbed44b6fe2ef6d468a9346cc1112581e2b1121d1f837dc8391173b1a035675f9bcc884392c3ce9f99d92be7f5c06eddda94d9af0f12f794ace1,0fb6b69d57c5ffa2b6db0841d364320ace4db7d340e67a8debf5073ccbc3263b0b5452a02a1eccd24eeb2ced96857d4e874099daf554fffb398583a5a6dccda8,6000, +11b100fda5ee7d57ca7dd149e93d8cce4c7f53a6246b6268d14b0781340212250e4bad7890dcd5ab2f3f32b1c662672dc3909766226c98f719dd2af3eda1e80ba324c744878ad6541077e73540b61dad1d0a033d74892c313b62c9926849f4ed,0f1cc952fe37669b279a37a40c45d6073cac96e68fb3da965b3cde0efe6874aa25f44609a3cee2966bbb8adb773ad99a27e2899cf590d24cc9c00bcd95193b46,6000, +0d8e7533f8bf584156280fcbc766f1364346c5b7d742b0a68da4f21c80591b4002e96503b1dc58ae1185226247ce34374b545088f32ef1287bd67e0418f684be0163f6296c462302f85ccab235f096945580ac2c291c206faa8df5d1486c630f,05b3a5b178410bfe4999c4bf450abca2d69167ac9d328804108c7c8fc4801ab507eecaa7a3c699754d1d8eeecfc379e9e6dfd7b15e90b04b81307e23e493e242,6000, +28b29f703ae013e2f0b11bd97fe7dcd2f3e6991f25581571f866f71f9172b5c904ed858ccdf07dbac1fcdfd0abec0c99c6672494b0dcca970c36aa74ed8154236e0d424fb48ea298be245b8205785ea6467e7545834d5c4dce5e0c2ce15a8376,1f8daa2adbfcf31d2dd43133571340097594e7d555d8bf64dcf294d20c35fdff22a09391a3c2237a8d8c04fc6a2f0239ae041c5c0275beced7cb1f882407bd31,6000, +2acb5ce8bfebb622b364c76950068986eeb6a16db963e1d5217a5c838fe54d5822d200e03ede8e2fd55b172139b053990c88f42ad9c708651df84342a68260cd531ee0a3326c6f25ab6819807f43e1b0f493a77d932515c0872a9fc1efe47435,0699e3cd6d41158bf140bde6363874a93751c663f8be9e55f0a1a2355a0f7b140d0d623661e829bbaa00ffcf39c0e16e8a791dfd42986875fe8da6a5544ee5b0,6000, +03543b804e15103d27c9af197c39630f9f7a6298f210d13792aa674887a899da02423e72c6a7c0e2219edff2d0d76712061ee1e25fda4032b42aba0864fbe48dfd23d4b56a023e64b373fd416904c4d228a50a2f3411fcafbfec6bff70a7ad36,03c8141c0a5b155ce03b928d984018792fd0d984b8a46b81d35df79fc31d24d508a701df38a3e1ec3508d190e2a748d9055f594a2dc80dbb26ea6850c3039b09,6000, +1c2cb2b4504b19c7e073679432e625f2706b7c4728cd9bd3ce36579f4de2f3902c8605f723ac2f73baa15eac674f62ab06c79809aa4a4be3391c4d41d5a6e62ca0a73a5b559cd0384ca11d444e34f40e04f2080483db9e54ae09e44ec19c26a1,1147da8fc5774b5ef94fda682437b04f9b6aea72987d1269496769baf7e67dc729fe144eab44c6da4c851123165cd6506ce3e10b7691b8bf11b757e2ae058fcb,6000, +0d6ad8e12b4f61e3e2a2252ce11428941f2a84b7f0a821cb8cc7699303bd4fec2247870562618fd8d6169072d9b33614d2acf800b3ba0ff68ef8d5fd4d6c250d3e70b3bed17894f958579644c83fa9d485121d580e2b061c697e68f950297768,0be6d75e2fe2887835d396dae11321ca7c53083abd6a0b270ee1c087593517aa2ffd1bad577de7cf2b19b82bfff0c66e2afbfb79a72cbe834290437f3caf2f21,6000, +d2acf800b3ba0ff68ef8d5fd4d6c250d3e70b3bed17894f958579644c83fa9d485121d580e2b061c697e68f9502977680d6ad8e12b4f61e3e2a2252ce11428941f2a84b7f0a821cb8cc7699303bd4fec2247870562618fd8d6169072d9b33614,,6000,invalid input parameters, point not in field +02acf800b3ba0ff68ef8d5fd4d6c250d3e70b3bed17894f958579644c83fa9d405121d580e2b061c697e68f9502977680d6ad8e12b4f61e3e2a2252ce11428941f2a84b7f0a821cb8cc7699303bd4fec2247870562618fd8d6169072d9b33614,,6000,invalid input parameters, point is not on curve +1c2cb2b4504b19c7e073679432e625f2706b7c4728cd9bd3ce36579f4de2f3902c8605f723ac2f73baa15eac674f62ab,,6000, +,,6000, +1A87B0584CE92F4593D161480614F2989035225609F08058CCFA3D0F940FEBE31A2F3C951F6DADCC7EE9007DFF81504B0FCD6D7CF59996EFDC33D92BF7F9F8F60100000000000000000000000000000000,0x220cb1540fa85ba04d863dca86de9359a43ac9fc084aebb9f2a936d989abbb602ccdc6c020dd2cf78332132b3f1d1122391b515035623cd6f53d4aea24ea2466,6000, +1A87B0584CE92F4593D161480614F2989035225609F08058CCFA3D0F940FEBE31A2F3C951F6DADCC7EE9007DFF81504B0FCD6D7CF59996EFDC33D92BF7F9F8F60000000000000000000000000000000100000000000000000000000000000000,1051acb0700ec6d42a88215852d582efbaef31529b6fcbc3277b5c1b300f5cf0135b2394bb45ab04b8bd7611bd2dfe1de6a4e6e2ccea1ea1955f577cd66af85b,6000, diff --git a/constantine/src/test/resources/eip196_pairing.csv b/constantine/src/test/resources/eip196_pairing.csv new file mode 100644 index 00000000..3bb6cf6d --- /dev/null +++ b/constantine/src/test/resources/eip196_pairing.csv @@ -0,0 +1,15 @@ +input,result,gas,notes +1c76476f4def4bb94541d57ebba1193381ffa7aa76ada664dd31c16024c43f593034dd2920f673e204fee2811c678745fc819b55d3e9d294e45c9b03a76aef41209dd15ebff5d46c4bd888e51a93cf99a7329636c63514396b4a452003a35bf704bf11ca01483bfa8b34b43561848d28905960114c8ac04049af4b6315a416782bb8324af6cfc93537a2ad1a445cfd0ca2a71acd7ac41fadbf933c2a51be344d120a2a4cf30c1bf9845f20c6fe39e07ea2cce61f0c9bb048165fe5e4de877550111e129f1cf1097710d41c4ac70fcdfa5ba2023c6ff1cbeac322de49d1b6df7c2032c61a830e3c17286de9462bf242fca2883585b93870a73853face6a6bf411198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa,0000000000000000000000000000000000000000000000000000000000000001,113000, +2eca0c7238bf16e83e7a1e6c5d49540685ff51380f309842a98561558019fc0203d3260361bb8451de5ff5ecd17f010ff22f5c31cdf184e9020b06fa5997db841213d2149b006137fcfb23036606f848d638d576a120ca981b5b1a5f9300b3ee2276cf730cf493cd95d64677bbb75fc42db72513a4c1e387b476d056f80aa75f21ee6226d31426322afcda621464d0611d226783262e21bb3bc86b537e986237096df1f82dff337dd5972e32a8ad43e28a78a96a823ef1cd4debe12b6552ea5f06967a1237ebfeca9aaae0d6d0bab8e28c198c5a339ef8a2407e31cdac516db922160fa257a5fd5b280642ff47b65eca77e626cb685c84fa6d3b6882a283ddd1198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa,0000000000000000000000000000000000000000000000000000000000000001,113000, +0f25929bcb43d5a57391564615c9e70a992b10eafa4db109709649cf48c50dd216da2f5cb6be7a0aa72c440c53c9bbdfec6c36c7d515536431b3a865468acbba2e89718ad33c8bed92e210e81d1853435399a271913a6520736a4729cf0d51eb01a9e2ffa2e92599b68e44de5bcf354fa2642bd4f26b259daa6f7ce3ed57aeb314a9a87b789a58af499b314e13c3d65bede56c07ea2d418d6874857b70763713178fb49a2d6cd347dc58973ff49613a20757d0fcc22079f9abd10c3baee245901b9e027bd5cfc2cb5db82d4dc9677ac795ec500ecd47deee3b5da006d6d049b811d7511c78158de484232fc68daf8a45cf217d1c2fae693ff5871e8752d73b21198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa,0000000000000000000000000000000000000000000000000000000000000001,113000, +2f2ea0b3da1e8ef11914acf8b2e1b32d99df51f5f4f206fc6b947eae860eddb6068134ddb33dc888ef446b648d72338684d678d2eb2371c61a50734d78da4b7225f83c8b6ab9de74e7da488ef02645c5a16a6652c3c71a15dc37fe3a5dcb7cb122acdedd6308e3bb230d226d16a105295f523a8a02bfc5e8bd2da135ac4c245d065bbad92e7c4e31bf3757f1fe7362a63fbfee50e7dc68da116e67d600d9bf6806d302580dc0661002994e7cd3a7f224e7ddc27802777486bf80f40e4ca3cfdb186bac5188a98c45e6016873d107f5cd131f3a3e339d0375e58bd6219347b008122ae2b09e539e152ec5364e7e2204b03d11d3caa038bfc7cd499f8176aacbee1f39e4e4afc4bc74790a4a028aff2c3d2538731fb755edefd8cb48d6ea589b5e283f150794b6736f670d6a1033f9b46c6f5204f50813eb85c8dc4b59db1c5d39140d97ee4d2b36d99bc49974d18ecca3e7ad51011956051b464d9e27d46cc25e0764bb98575bd466d32db7b15f582b2d5c452b36aa394b789366e5e3ca5aabd415794ab061441e51d01e94640b7e3084a07e02c78cf3103c542bc5b298669f211b88da1679b0b64a63b7e0e7bfe52aae524f73a55be7fe70c7e9bfc94b4cf0da1213d2149b006137fcfb23036606f848d638d576a120ca981b5b1a5f9300b3ee2276cf730cf493cd95d64677bbb75fc42db72513a4c1e387b476d056f80aa75f21ee6226d31426322afcda621464d0611d226783262e21bb3bc86b537e986237096df1f82dff337dd5972e32a8ad43e28a78a96a823ef1cd4debe12b6552ea5f,0000000000000000000000000000000000000000000000000000000000000001,147000, +20a754d2071d4d53903e3b31a7e98ad6882d58aec240ef981fdf0a9d22c5926a29c853fcea789887315916bbeb89ca37edb355b4f980c9a12a94f30deeed30211213d2149b006137fcfb23036606f848d638d576a120ca981b5b1a5f9300b3ee2276cf730cf493cd95d64677bbb75fc42db72513a4c1e387b476d056f80aa75f21ee6226d31426322afcda621464d0611d226783262e21bb3bc86b537e986237096df1f82dff337dd5972e32a8ad43e28a78a96a823ef1cd4debe12b6552ea5f1abb4a25eb9379ae96c84fff9f0540abcfc0a0d11aeda02d4f37e4baf74cb0c11073b3ff2cdbb38755f8691ea59e9606696b3ff278acfc098fa8226470d03869217cee0a9ad79a4493b5253e2e4e3a39fc2df38419f230d341f60cb064a0ac290a3d76f140db8418ba512272381446eb73958670f00cf46f1d9e64cba057b53c26f64a8ec70387a13e41430ed3ee4a7db2059cc5fc13c067194bcc0cb49a98552fd72bd9edb657346127da132e5b82ab908f5816c826acb499e22f2412d1a2d70f25929bcb43d5a57391564615c9e70a992b10eafa4db109709649cf48c50dd2198a1f162a73261f112401aa2db79c7dab1533c9935c77290a6ce3b191f2318d198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa,0000000000000000000000000000000000000000000000000000000000000001,147000, +1c76476f4def4bb94541d57ebba1193381ffa7aa76ada664dd31c16024c43f593034dd2920f673e204fee2811c678745fc819b55d3e9d294e45c9b03a76aef41209dd15ebff5d46c4bd888e51a93cf99a7329636c63514396b4a452003a35bf704bf11ca01483bfa8b34b43561848d28905960114c8ac04049af4b6315a416782bb8324af6cfc93537a2ad1a445cfd0ca2a71acd7ac41fadbf933c2a51be344d120a2a4cf30c1bf9845f20c6fe39e07ea2cce61f0c9bb048165fe5e4de877550111e129f1cf1097710d41c4ac70fcdfa5ba2023c6ff1cbeac322de49d1b6df7c103188585e2364128fe25c70558f1560f4f9350baf3959e603cc91486e110936198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa,0000000000000000000000000000000000000000000000000000000000000000,113000, +,0000000000000000000000000000000000000000000000000000000000000001,45000, +00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa,0000000000000000000000000000000000000000000000000000000000000000,79000, +00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d,0000000000000000000000000000000000000000000000000000000000000001,113000, +00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002203e205db4f19b37b60121b83a7333706db86431c6d835849957ed8c3928ad7927dc7234fd11d3e8c36c59277c3e6f149d5cd3cfa9a62aee49f8130962b4b3b9195e8aa5b7827463722b8c153931579d3505566b4edf48d498e185f0509de15204bb53b8977e5f92a0bc372742c4830944a59b4fe6b1c0466e2a6dad122b5d2e030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd31a76dae6d3272396d0cbe61fced2bc532edac647851e3ac53ce1cc9c7e645a83198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa,0000000000000000000000000000000000000000000000000000000000000001,113000, +105456a333e6d636854f987ea7bb713dfd0ae8371a72aea313ae0c32c0bf10160cf031d41b41557f3e7e3ba0c51bebe5da8e6ecd855ec50fc87efcdeac168bcc0476be093a6d2b4bbf907172049874af11e1b6267606e00804d3ff0037ec57fd3010c68cb50161b7d1d96bb71edfec9880171954e56871abf3d93cc94d745fa114c059d74e5b6c4ec14ae5864ebe23a71781d86c29fb8fb6cce94f70d3de7a2101b33461f39d9e887dbb100f170a2345dde3c07e256d1dfa2b657ba5cd030427000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000021a2c3013d2ea92e13c800cde68ef56a294b883f6ac35d25f587c09b1b3c635f7290158a80cd3d66530f74dc94c94adb88f5cdb481acca997b6e60071f08a115f2f997f3dbd66a7afe07fe7862ce239edba9e05c5afff7f8a1259c9733b2dfbb929d1691530ca701b4a106054688728c9972c8512e9789e9567aae23e302ccd75,0000000000000000000000000000000000000000000000000000000000000001,113000, +00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d,0000000000000000000000000000000000000000000000000000000000000001,385000, +00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002203e205db4f19b37b60121b83a7333706db86431c6d835849957ed8c3928ad7927dc7234fd11d3e8c36c59277c3e6f149d5cd3cfa9a62aee49f8130962b4b3b9195e8aa5b7827463722b8c153931579d3505566b4edf48d498e185f0509de15204bb53b8977e5f92a0bc372742c4830944a59b4fe6b1c0466e2a6dad122b5d2e030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd31a76dae6d3272396d0cbe61fced2bc532edac647851e3ac53ce1cc9c7e645a83198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002203e205db4f19b37b60121b83a7333706db86431c6d835849957ed8c3928ad7927dc7234fd11d3e8c36c59277c3e6f149d5cd3cfa9a62aee49f8130962b4b3b9195e8aa5b7827463722b8c153931579d3505566b4edf48d498e185f0509de15204bb53b8977e5f92a0bc372742c4830944a59b4fe6b1c0466e2a6dad122b5d2e030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd31a76dae6d3272396d0cbe61fced2bc532edac647851e3ac53ce1cc9c7e645a83198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002203e205db4f19b37b60121b83a7333706db86431c6d835849957ed8c3928ad7927dc7234fd11d3e8c36c59277c3e6f149d5cd3cfa9a62aee49f8130962b4b3b9195e8aa5b7827463722b8c153931579d3505566b4edf48d498e185f0509de15204bb53b8977e5f92a0bc372742c4830944a59b4fe6b1c0466e2a6dad122b5d2e030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd31a76dae6d3272396d0cbe61fced2bc532edac647851e3ac53ce1cc9c7e645a83198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002203e205db4f19b37b60121b83a7333706db86431c6d835849957ed8c3928ad7927dc7234fd11d3e8c36c59277c3e6f149d5cd3cfa9a62aee49f8130962b4b3b9195e8aa5b7827463722b8c153931579d3505566b4edf48d498e185f0509de15204bb53b8977e5f92a0bc372742c4830944a59b4fe6b1c0466e2a6dad122b5d2e030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd31a76dae6d3272396d0cbe61fced2bc532edac647851e3ac53ce1cc9c7e645a83198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002203e205db4f19b37b60121b83a7333706db86431c6d835849957ed8c3928ad7927dc7234fd11d3e8c36c59277c3e6f149d5cd3cfa9a62aee49f8130962b4b3b9195e8aa5b7827463722b8c153931579d3505566b4edf48d498e185f0509de15204bb53b8977e5f92a0bc372742c4830944a59b4fe6b1c0466e2a6dad122b5d2e030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd31a76dae6d3272396d0cbe61fced2bc532edac647851e3ac53ce1cc9c7e645a83198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa,0000000000000000000000000000000000000000000000000000000000000001,385000, +105456a333e6d636854f987ea7bb713dfd0ae8371a72aea313ae0c32c0bf10160cf031d41b41557f3e7e3ba0c51bebe5da8e6ecd855ec50fc87efcdeac168bcc0476be093a6d2b4bbf907172049874af11e1b6267606e00804d3ff0037ec57fd3010c68cb50161b7d1d96bb71edfec9880171954e56871abf3d93cc94d745fa114c059d74e5b6c4ec14ae5864ebe23a71781d86c29fb8fb6cce94f70d3de7a2101b33461f39d9e887dbb100f170a2345dde3c07e256d1dfa2b657ba5cd030427000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000021a2c3013d2ea92e13c800cde68ef56a294b883f6ac35d25f587c09b1b3c635f7290158a80cd3d66530f74dc94c94adb88f5cdb481acca997b6e60071f08a115f2f997f3dbd66a7afe07fe7862ce239edba9e05c5afff7f8a1259c9733b2dfbb929d1691530ca701b4a106054688728c9972c8512e9789e9567aae23e302ccd75,0000000000000000000000000000000000000000000000000000000000000001,113000, diff --git a/settings.gradle b/settings.gradle index 88388036..5c3ac8ca 100644 --- a/settings.gradle +++ b/settings.gradle @@ -21,3 +21,4 @@ include 'ipa-multipoint' include 'secp256k1' include 'secp256r1' include 'gnark' +include 'constantine' From ead934c04308ca4861c13f30820c5fc1cfb9715d Mon Sep 17 00:00:00 2001 From: garyschulte Date: Tue, 13 Aug 2024 15:13:16 -0700 Subject: [PATCH 2/4] Revert "Check released version and configured version (#196)" (#201) This reverts commit 5001ac8efab50d9d95236e4b60c9343e54011ec0. Signed-off-by: garyschulte --- .github/workflows/build.yml | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3f899c5f..c4993d7e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -36,25 +36,6 @@ jobs: uses: actions/checkout@v4 with: submodules: recursive - # Check whether gradle.properties version has been released already - # This prevents accidently publish same version - # Only check binary for arithmetic as all published together and arithmetic is the first - - name: Check existing release - run: | - # Check whether version contains SNAPSHOT - grep "^version" gradle.properties | grep -q SNAPSHOT || { - # Extract version from gradle.properties - VERSION=$(grep "^version" gradle.properties | sed 's|^version=\(.*\)$|\1|g') - echo "Query for version [$VERSION]" - curl --head -L --silent --output /dev/null --fail "$ART_URL/$VERSION" && { - echo "ERROR: Binary arithmetic already exists for version [$VERSION]" - echo "ERROR: Blocking republishing same version to the Besu Artifactory" - echo "url $ART_URL/$VERSION" - exit 1 - } - } - env: - ART_URL: 'https://hyperledger.jfrog.io/artifactory/besu-maven/org/hyperledger/besu/arithmetic' - name: Build run: ./build.sh - uses: actions/upload-artifact@v3.1.0 From 6b933823b4b049262bd168edadc85db3dea889ed Mon Sep 17 00:00:00 2001 From: garyschulte Date: Tue, 13 Aug 2024 15:45:26 -0700 Subject: [PATCH 3/4] release version for 0.9.4 (#200) Signed-off-by: garyschulte --- CHANGELOG.md | 6 +++++- gradle.properties | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c70e3dca..a85b9304 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ # Changelog -# 0.9.4-SNAPSHOT +# 0.9.5-SNAPSHOT + +# 0.9.4 +* initial support for Constantine, bn254 curve [#184](https://github.com/hyperledger/besu-native/pull/184) +* clarify go stack release behavior in gnark-crypto [#197](https://github.com/hyperledger/besu-native/pull/197) # 0.9.3 * remove long-deprecated altbn128 [#192](https://github.com/hyperledger/besu-native/pull/192) diff --git a/gradle.properties b/gradle.properties index 3a3c9ca1..c86294a2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1 @@ -version=0.9.4-SNAPSHOT +version=0.9.4 From bc48568407a6bdcbe7c8a6d57d3055af5022fc6e Mon Sep 17 00:00:00 2001 From: garyschulte Date: Tue, 13 Aug 2024 16:08:48 -0700 Subject: [PATCH 4/4] bump for 0.9.5-SNAPSHOT after 0.9.4 release (#202) Signed-off-by: garyschulte --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index c86294a2..892423ab 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1 @@ -version=0.9.4 +version=0.9.5-SNAPSHOT